是否可以使用通用函数指针作为模板参数?函数指针模板可以接受自由函数、成员函数和 lambda 函数。为简单起见,假设函数只有一个参数,例如
template<class ArgumentT, class ReturnT, function* f>
struct A
{
// f is used somewhere.
};
是否可以使用通用函数指针作为模板参数?函数指针模板可以接受自由函数、成员函数和 lambda 函数。为简单起见,假设函数只有一个参数,例如
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()
,然后调用它(事实上,这通常是更可取的)。
如果可以使用 C++11,我建议使用 std::function<> ;如果不能,我建议使用 boost::function<>:
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 ,但这取决于您的代码。
您正在组合类型和数据,您想要更多类似的东西:
template<class ArgumentT, class ReturnT, typename F*>
struct A {
//use F* to refer to f somewhere
};
您可以通过以下方式实现接近目标:
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.
};
...但是您不能将 astd::function<ReturnT ()>
作为非类型模板参数。函数指针的特化也将接受非捕获 lambda。