web-dev-qa-db-ja.com

std :: functionを使用して関数テンプレートを指す方法

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

いいえ。テンプレート関数はまさにそれ、テンプレートです。それは実際の機能ではありません。 std :: functionは、テンプレート関数の特定のインスタンス化を指すことができます。 func<int,int>

20
Erik

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++で解決される必要があるため、ユニバーサル型の数量詞(「任意の型に適用可能」)で遅延バインディングを使用することはできません。それはまさにそれが転がる方法です。

25
Victor Nicollet

これは、あなたの望むことですか?

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

エリックが指摘するように、これは直接不可能です。おそらく希望する効果を実現するには、ポインターを使用するコードをテンプレートにする必要があります。

1
Björn Pollex