#include <functional>
int func(int x, int y)
{
return x+y;
}
int main()
{
typedef std::function<int(int, int)> Funcp;
Funcp funcp = func;
return 0;
}
しかし、テンプレート関数を指すことは可能ですか?
#include <functional>
template<class T>
T func(T x, T y)
{
return x+y;
}
int main()
{
typedef std::function<?(?, ?)> Funcp;
Funcp funcp = func;
return 0;
}
いいえ。テンプレート関数はまさにそれ、テンプレートです。それは実際の機能ではありません。 std :: functionは、テンプレート関数の特定のインスタンス化を指すことができます。 func<int,int>
C++にはテンプレート関数のようなものはありません—人々が何気なく「テンプレート関数」と呼ぶのは実際には関数テンプレート:関数を定義するテンプレートです。
そのため、上記の2番目の例のfunc
は関数ではなく、(関数)テンプレートであり、関数と同じように使用することはできません。特に、 std::function
関数が提供されることを期待しています。
これを回避する方法は、達成しようとしていることによって異なります。関数を使用するコードを任意の型で機能させようとしている場合は、そのコードを関数またはクラステンプレートに配置するだけです。
template <typename T>
void use_function(T t) {
typedef std::function<T(T,T)> Funcp = func<T>;
// use Funcp here
}
ただし、「任意の型に適用できる」はコンパイル時にC++で解決される必要があるため、ユニバーサル型の数量詞(「任意の型に適用可能」)で遅延バインディングを使用することはできません。それはまさにそれが転がる方法です。
これは、あなたの望むことですか?
#include <functional>
template<class T>
T func(T x, T y)
{
return x+y;
}
template<typename T> struct FunctionType
{
typedef std::function<T(T, T)> Type ;
} ;
int main()
{
FunctionType<int>::Type Funcp = func<int> ;
}
エリックが指摘するように、これは直接不可能です。おそらく希望する効果を実現するには、ポインターを使用するコードをテンプレートにする必要があります。