C++ 如何在C+中使用函数作为类的初始值设定项+;

C++ 如何在C+中使用函数作为类的初始值设定项+;,c++,function,class,arduino,arduino-c++,C++,Function,Class,Arduino,Arduino C++,我试图创建一个类,在初始化时接受函数作为参数。理想情况下,该函数应该已经存在。我知道在Python中,我可以做到: class测试类: def _u初始(自身,函数参数): self.fp=函数参数 def executeFP(自我): self.fp() def testFunction(): 打印(“测试”) q=TestClass(testFunction) q、 executeFP() 如何在C++中实现这一点?(如果有必要,我会使用Arduino)您可以执行以下操作: (不确定Ard

我试图创建一个类,在初始化时接受函数作为参数。理想情况下,该函数应该已经存在。我知道在Python中,我可以做到:

class测试类:
def _u初始(自身,函数参数):
self.fp=函数参数
def executeFP(自我):
self.fp()
def testFunction():
打印(“测试”)
q=TestClass(testFunction)
q、 executeFP()

如何在C++中实现这一点?(如果有必要,我会使用Arduino)

您可以执行以下操作: (不确定Arduino是否可以拥有以下内容)

模板
类TestClass{
公众:
TestClass(F func)
:m_func(func)
{
}
void executeFP()
{
m_func();
}
私人:
F*m_func;
};
void doStuff()
{

std::coutArduino没有
std::function
,因为AVR GCC没有随标准库提供,因此评论中的建议对该特定平台不起作用

如果您需要Arduino或其他嵌入式平台的类似行为,可以使用的
etl::function
etl::delegate
,或创建自己的实现。
std::function
使用堆分配进行类型擦除,这对于嵌入式平台通常不是一个好的选择

最简单的实现将使用C风格的函数指针:

//函数类型的一般定义
模板
类函数;
//R:返回类型
//Args:函数可以接受的任何参数
模板
类函数{
公众:
//等效C函数指针的类型定义
使用函数_type=R(*)(Args…);
//默认构造函数:空函数。
//如果以这种方式使用函数,则不要在未初始化时调用该函数。
函数()=默认值;
//构造函数:存储函数指针
函数(函数类型f):函数ptr(f){};
//调用操作符:像调用普通函数一样调用函数对象
//PS:这个版本不能实现完美的转发。
R运算符()(Args…Args){返回函数_ptr(Args…;}
私人:
功能类型功能ptr;
};
//辅助函数可用于推断类型!
模板
函数make_函数(R(*f)(Args…){
返回{f};
}
,以及一些用例


当然,您也可以在这种情况下使用C指针,但该类可以扩展为其他类型。如果您需要更复杂的行为,如函子、成员函数和捕获lambda,请参阅我上面引用的ETL实现。

如果有人解释了为什么他们在投票后对帖子投了反对票,那么投反对票就行了不要告诉我任何人都不满意尝试的缺乏可能。“弱者”不应该是匿名函数,它应该是已经存在的函数。STD::函数和模板方法都与现有函数一起工作。你不应该尝试从ARDUNO代码片段或答案中学习C++。任何好的C++ BOO。K应该将传递函数作为参数,可能不止一种方式。它实际上是C++的基础部分。<代码> MyFUNC(FUNC)——它们有不同的类型(<代码> F*<代码>和<代码> f<代码>)…@Aconcagua
foo
被声明为具有
F
类型,它实际上具有
F*
指针类型。虽然
decltype(doStuff)
的计算结果为
void()
而不是
void(*)
,但该函数可隐式转换为指向自身的指针,位于
someObj(doStuff)
,因此没有错误。嗯,好吧,但是取消了与functor一起使用的资格。将指针与
decltype(&doStuff)
结合跳过可以避免这种情况(或者如果C++17可用,我们可以直接推导出模板参数…)。我已经尝试在类中实现了这一点,但它给出了一个错误消息“调用'function::function()'时没有匹配的函数”以及一系列其他错误。其中一些错误似乎是因为我无法生成空函数(在.h文件中),但如果不这样做,我不知道如何使我的类的所有方法都可以访问该函数。我已将我的代码和所有编译器错误放在了@Merlin04 my bad。通过定义函数构造函数,我禁用了它的默认构造函数,并且没有声明回它。您的代码在Arduino编译器上编译时没有错误吗顺便说一句,对于这个特定的情况,您不需要使用make_函数(如果您只需要C风格的函数,也不需要使用这个包装器)。好的,如果我不需要使用这个包装,我该怎么做?@Merlin04如果你想在它上面实现额外的功能,比如我提到的ETL类,这个包装将是一个基础。如果你只想使用没有参数的void C函数,你可以使用function_type=void(*)定义一个类型,比如
并在课堂上使用它。
template <typename F>
class TestClass {
    public:
    TestClass( F func )
        :m_func(func)
    {

    }

    void executeFP()
    {
        m_func();
    }

    private:
    F *m_func;

};

void doStuff()
{

    std::cout << "test" << std::endl;
}

bool doAnotherStuff( )
{
    std::cout <<"test " << 40 +2 << std::endl;

    return true;

}

int main()
{
    TestClass<decltype(doStuff)> someObj ( doStuff );

    TestClass<decltype(doAnotherStuff)> someObj2 ( doAnotherStuff );

    someObj.executeFP();

    someObj2.executeFP();

}