是否可以使用通用函数指针作为模板参数?函数指针模板可以接受自由函数,成员函数和lambda函数。为简单起见,假设函数只有一个参数,比如
template<class ArgumentT, class ReturnT, function* f>
struct A
{
// f is used somewhere.
};
答案 0 :(得分: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()
的类,然后调用它(事实上,这通常更可取)。
答案 1 :(得分:2)
我建议使用std :: function&lt;&gt;如果你可以使用C ++ 11或boost :: function&lt;&gt;如果你不能:
template<class ArgumentT, class ReturnT > struct A {
typedef std::function< ReturnT( ArgumentT ) > Function;
void foobar( Function f ) { ReturnT ret = f( arg ); }
};
在这种情况下,您可以传递函数指针,仿函数,lambda或使用std :: bind或boost :: bind几乎任何签名不匹配的函数。在这种情况下我不确定你需要模板,你可以直接使用std :: function,但这取决于你的代码。
答案 2 :(得分:0)
您正在组合类型和数据,您需要更多类似的内容:
template<class ArgumentT, class ReturnT, typename F*>
struct A {
//use F* to refer to f somewhere
};
答案 3 :(得分:0)
你可以通过以下方式实现目标:
template<class ArgumentT, class ReturnT, class F, F f>
struct A;
template<class ArgumentT, class ReturnT, ReturnT (*f)()>
struct A<ArgumentT, ReturnT, ReturnT (*)(), f>
{
// f is used somewhere.
};
template<class ArgumentT, class ReturnT, class C, ReturnT (C::*f)()>
struct A<ArgumentT, ReturnT, ReturnT (C::*)(), f>
{
// f is used somewhere.
};
...但是您不能将std::function<ReturnT ()>
之类的内容作为非类型模板参数。函数指针的特化也将接受非捕获lambdas。