テンプレートを戻り値に使用する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 658
登録日時: 15年前
住所: 宮崎県
連絡を取る:

テンプレートを戻り値に使用する

#1

投稿記事 by dic » 14年前

汎用的な関数を作りたいのでテンプレートを作ろうと思い
テンプレートを使ったもので実現できないのかなぁと思いました
それで、戻り値を汎用変数にしたのですがコンパイルが通りません
参考書にも引数には汎用変数を使っているのですが
戻り値に使用している例はみたことがないです
下がソースコードでコンパイルエラーなのですが
汎用変数を戻り値にした関数は作成できないのでしょうか?

コード:

#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;
}

アバター
a5ua
記事: 199
登録日時: 15年前

Re: テンプレートを戻り値に使用する

#2

投稿記事 by a5ua » 14年前

できますよ。
ただし、今回のような場合は呼び出し時にテンプレートパラメータを明示する必要があります。

コード:

#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;
}

たかぎ
記事: 328
登録日時: 15年前
住所: 大阪
連絡を取る:

Re: テンプレートを戻り値に使用する

#3

投稿記事 by たかぎ » 14年前

強引に同じ機能を実現できないわけではありませんが...

コード:

#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;
}
あまりお勧めはしません。

dic
記事: 658
登録日時: 15年前
住所: 宮崎県
連絡を取る:

Re: テンプレートを戻り値に使用する

#4

投稿記事 by dic » 14年前

>>a5uaさん
なかなかやっかいですね

>>たかぎさん
これは、難しすぎる


なるほど、結構複雑になってしまうので
戻り値でなく引数に汎用変数のポインタを渡すことにします

ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る