C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 函数/仿函数作为模板参数.它们可以存储吗?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
想象一下,我有以下免费功能和仿函数
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();
    }
};

在这种情况下,我在声明类时指定函数/函子,但直到稍后才调用它.它适用于仿函数

@H_231_2@myClass<MyFunctor> myClass1; myClass1.execute();

但不适用于功能

@H_231_2@myClass<myFreeFunction> myClass2; myClass2.execute();

编译说:

这是公平的……但你会如何构建这个?

注意:我知道std :: function并且最终可能会使用它.它然速度慢得多,但我正在虑所有选择.

谢谢,

大卫

解决方法

问题是freefunction不是一个类型而是一个元素(在这种情况下是一个函数指针).

解决这个问题,你需要在构造中传递函数,但是你仍然需要知道确切的类型.

@H_231_2@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 it
template<FuncType>
myclass<FuncType> make_class(FuncType funC)
{
     return myclass<FuncType>(func);
}
//called like
myclass mc=make_class(&my_callBACk);

不要为了改变构造函数

template<typename CallBACk>
myclass{
private:
   CallBACk call_BACk;
public:
   myclass(CallBACk call_BACk_)
   : call_BACk(call_BACk_)
   {}
};

或类似的东西

大佬总结

以上是大佬教程为你收集整理的c – 函数/仿函数作为模板参数.它们可以存储吗?全部内容,希望文章能够帮你解决c – 函数/仿函数作为模板参数.它们可以存储吗?所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。