c – 函数仿函数作为模板参数.它们可以存储吗?

c – 函数仿函数作为模板参数.它们可以存储吗?,第1张

概述想象一下,我有以下免费功能和仿函数: void myFreeFunction(void){ cout << "Executing free function" << endl;}struct MyFunctor{ void operator()(void) { cout << "Executing functor" << endl; }} 想象一下,我有以下免费功能和仿函数:
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 – 函数/仿函数作为模板参数.它们可以存储吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1238845.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存