Dav*_*ams 7 c++ templates callback
想象一下,我有以下免费功能和仿函数:
void myFreeFunction(void)
{
cout << "Executing free function" << endl;
}
struct MyFunctor
{
void operator()(void)
{
cout << "Executing functor" << endl;
}
};
Run Code Online (Sandbox Code Playgroud)
正如这个答案所描述的,我可以将我的函数或仿函数作为模板参数传递给另一个函数:
template <typename F>
void doOperation(F f)
{
f();
}
Run Code Online (Sandbox Code Playgroud)
然后打电话:
doOperation(myFreeFunction);
doOperation(MyFunctor());
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是,如果我想要以下内容:
template<typename Callback>
class MyClass
{
private:
Callback mCallback;
public:
MyClass(){}
void execute()
{
mCallback();
}
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我在声明类时指定函数/函子,但是直到稍后才调用它.它适用于仿函数:
MyClass<MyFunctor> myClass1;
myClass1.execute();
Run Code Online (Sandbox Code Playgroud)
但不适用于功能:
MyClass<myFreeFunction> myClass2;
myClass2.execute();
Run Code Online (Sandbox Code Playgroud)
编译说:
错误C2923:'MyClass':'myFreeFunction'不是参数'Callback'的有效模板类型参数
这是公平的......但你会如何构建这个?
注意:我知道std :: function并且最终可能会使用它.它虽然速度慢得多,但我正在考虑所有选择.
谢谢,
大卫
问题是freefunction不是一个类型而是一个元素(在这种情况下是函数指针.
要解决这个问题,你需要在构造中传递函数,但是你仍然需要知道确切的类型.
myclass<call_back_t> my_class(call_back);
Run Code Online (Sandbox Code Playgroud)
编辑:在c ++ 11中可以获得类型 decltype(call_back)
然而,回调可能很麻烦,创建生成器功能通常要容易得多
//this should be in the namespace of the class or a static member of it
template<FuncType>
myclass<FuncType> make_class(FuncType func)
{
return myclass<FuncType>(func);
}
//called like
myclass mc=make_class(&my_callback);
Run Code Online (Sandbox Code Playgroud)
不要为了改变构造函数
template<typename CallBack>
myclass{
private:
CallBack call_back;
public:
myclass(CallBack call_back_)
: call_back(call_back_)
{}
};
Run Code Online (Sandbox Code Playgroud)
或类似的东西