ページ 1 / 1
テンプレートを戻り値に使用する
Posted: 2011年6月11日(土) 11:18
by dic
汎用的な関数を作りたいのでテンプレートを作ろうと思い
テンプレートを使ったもので実現できないのかなぁと思いました
それで、戻り値を汎用変数にしたのですがコンパイルが通りません
参考書にも引数には汎用変数を使っているのですが
戻り値に使用している例はみたことがないです
下がソースコードでコンパイルエラーなのですが
汎用変数を戻り値にした関数は作成できないのでしょうか?
コード:
#include <iostream>
using namespace std;
template <class X>
X func();
X func()
{
int i = 10;
cout << "in func" << endl;
return i;
}
int main()
{
int i;
i = func();
cout << i << endl;
return 0;
}
Re: テンプレートを戻り値に使用する
Posted: 2011年6月11日(土) 12:46
by a5ua
できますよ。
ただし、今回のような場合は呼び出し時にテンプレートパラメータを明示する必要があります。
コード:
#include <iostream>
#include <vector>
using namespace std;
template <class X>
X func()
{
X x(10); // Xはintから変換可能でなければならない
cout << "in func" << endl;
return x;
}
int main()
{
// int型の10
int x = func<int>();
// double型の10
double y = func<double>();
// 要素数10のvector<int>
vector<int> z = func< vector<int> >();
return 0;
}
Re: テンプレートを戻り値に使用する
Posted: 2011年6月11日(土) 13:45
by たかぎ
強引に同じ機能を実現できないわけではありませんが...
コード:
#include <iostream>
struct func
{
template <class T>
operator T() const
{
T value = T(10);
std::cout << "in func" << std::endl;
return value;
}
};
int main()
{
int i = func();
std::cout << i << std::endl;
}
あまりお勧めはしません。
Re: テンプレートを戻り値に使用する
Posted: 2011年6月11日(土) 16:29
by dic
>>a5uaさん
なかなかやっかいですね
>>たかぎさん
これは、難しすぎる
なるほど、結構複雑になってしまうので
戻り値でなく引数に汎用変数のポインタを渡すことにします
ありがとうございました