7

一般的な関数ポインタをテンプレート パラメータとして使用することはできますか? 関数ポインター テンプレートは、フリー関数、メンバー関数、およびラムダ関数を受け入れることができます。簡単にするために、関数には引数が 1 つだけあると仮定します。

template<class ArgumentT, class ReturnT, function* f>
struct A
{
   // f is used somewhere.
};
4

4 に答える 4

9

通常のテンプレート引数は関数を参照できます。

#include <iostream>

template <class ArgT, class RetT, class F>
struct A {
    F f;
public:
    A(F f) : f(f) {}

    RetT operator()(ArgT arg) { return f(arg); }
};

int unchanged(int i) { return i; }

int main(){
    A < int, int, int(*)(int)> t{ unchanged };

    for (int i = 0; i < 10; i++)
        std::cout << t(i) << "\n";
}

ただし、テンプレート引数を関数に制限するものは何もありません。オーバーロードするクラスを簡単に使用してoperator()、代わりにそれを呼び出すことができます (実際、多くの場合、それが望ましいです)。

于 2013-09-25T14:58:47.967 に答える
0

タイプとデータを組み合わせているので、次のようなものが必要です。

template<class ArgumentT, class ReturnT, typename F*>
struct A {
    //use F* to refer to f somewhere
};
于 2013-09-25T14:55:22.670 に答える