voID myFreeFunction(voID){ cout << "Executing free function" << endl;}struct MyFunctor{ voID operator()(voID) { cout << "Executing functor" << endl; }};
正如this answer所述,我可以将我的函数或函子作为模板参数传递给另一个函数:
template <typename F>voID doOperation(F f){ f();}
然后打电话:
doOperation(myFreeFunction);doOperation(MyFunctor());
到现在为止还挺好.但是,如果我想要以下内容:
template<typename Callback>class MyClass{private: Callback mCallback;public: MyClass(){} voID execute() { mCallback(); }};
在这种情况下,我在声明类时指定函数/函子,但直到稍后才调用它.它适用于仿函数:
MyClass<MyFunctor> myClass1;myClass1.execute();
但不适用于功能:
MyClass<myFreeFunction> myClass2;myClass2.execute();
编译说:
error C2923: ‘MyClass’ : ‘myFreeFunction’ is not a valID template type argument for parameter ‘Callback’
这是公平的……但你会如何构建这个?
注意:我知道std :: function并且最终可能会使用它.它虽然速度慢得多,但我正在考虑所有选择.
谢谢,
大卫
解决方法 问题是freefunction不是一个类型而是一个元素(在这种情况下是一个函数指针).要解决这个问题,你需要在构造中传递函数,但是你仍然需要知道确切的类型.
myclass<call_back_t> my_class(call_back);
编辑:在c 11中,类型可以从decltype(call_back)获得
然而,回调可能很麻烦,创建生成器功能通常要容易得多
//this should be in the namespace of the class or a static member of ittemplate<FuncType>myclass<FuncType> make_class(FuncType func){ return myclass<FuncType>(func);}//called likemyclass mc=make_class(&my_callback);
不要为了改变构造函数
template<typename CallBack>myclass{private: CallBack call_back;public: myclass(CallBack call_back_) : call_back(call_back_) {}};
或类似的东西
总结以上是内存溢出为你收集整理的c – 函数/仿函数作为模板参数.它们可以存储吗?全部内容,希望文章能够帮你解决c – 函数/仿函数作为模板参数.它们可以存储吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)