一般的な関数ポインタをテンプレート パラメータとして使用することはできますか? 関数ポインター テンプレートは、フリー関数、メンバー関数、およびラムダ関数を受け入れることができます。簡単にするために、関数には引数が 1 つだけあると仮定します。
template<class ArgumentT, class ReturnT, function* f>
struct A
{
// f is used somewhere.
};
一般的な関数ポインタをテンプレート パラメータとして使用することはできますか? 関数ポインター テンプレートは、フリー関数、メンバー関数、およびラムダ関数を受け入れることができます。簡単にするために、関数には引数が 1 つだけあると仮定します。
template<class ArgumentT, class ReturnT, function* f>
struct A
{
// f is used somewhere.
};
通常のテンプレート引数は関数を参照できます。
#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()
、代わりにそれを呼び出すことができます (実際、多くの場合、それが望ましいです)。
タイプとデータを組み合わせているので、次のようなものが必要です。
template<class ArgumentT, class ReturnT, typename F*>
struct A {
//use F* to refer to f somewhere
};