如何将函数传递给构造函数,然后将其设置为变量?
Posted
技术标签:
【中文标题】如何将函数传递给构造函数,然后将其设置为变量?【英文标题】:How do I pass in a function to a constructor that will then be set to a variable? 【发布时间】:2021-04-11 02:30:04 【问题描述】:我不明白我做错了什么。我正在尝试将一个函数传递给构造函数,将该函数设置为一个变量,然后稍后调用该变量。 (如回调)
我得到的错误是“没有匹配的构造函数”,因为 void 不是回调......但我认为回调只是一个返回 void 的方法?
头文件
class Cars
typedef void *callback();
public:
Cars(callback* method);
private:
callback* method;
void trigger();
类文件
Cars::Cars(callback method)
this->method = method;
void Cars::trigger()
method();
主文件
void doSomething()
// does something
Cars car = Cars(doSomething());
【问题讨论】:
在现代 C++ 中,您可能希望使用std::function
而不是回调函数指针。
@tadman — std::function
增加了相当多的开销来支持参数转换和返回类型转换。如果您不需要这些,则无需承担这些开销。
@PeteBecker 除非你打了数百万个电话,否则我怀疑你会注意到。
@tadman——如果你不需要,就不要付钱。
【参考方案1】:
这里有几个问题。
typedef void *callback();
这将callback
声明为一个返回指向void
的指针的函数。
Cars(callback* method);
因此,构造函数需要一个指向函数的指针,该函数返回指向 void 的指针。您的明显意图是使用指向返回void
的函数的指针,而不是指向void
的指针。因此,typedef
应该是:
typedef void callback();
但是,有些人发现最终结果有些复杂。相反,使用起来更清晰:
typedef void (*callback)();
Cars(callback method);
这是同样的事情,但更清楚一点。但这不是唯一的问题。
void doSomething()
// does something
这声明并定义了一个返回void
的函数。
Cars car = Cars(doSomething());
鉴于上述定义,在 C++ 中,表达式doSomething()
显然意味着对该函数的调用,该函数产生void
结果,然后将其传递给Cars
构造函数。当然,这不是你想要做的。相反,正确的语法是:
Cars car = Cars(doSomething);
或
Cars car = Cars(&doSomething);
随你喜欢。单独声明的函数的名称计算为指向函数的指针(有或没有明确的&
)。
【讨论】:
哇哦,这解决了很多问题。谢谢!对于“typedef void (*callback)()”,为什么会达到同样的效果? 不仅如此,构造函数的参数也只是callback
而不是callback *
。两者的组合在逻辑上是相同的。以上是关于如何将函数传递给构造函数,然后将其设置为变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何将构造函数参数传递给 AppDomain.CreateInstanceXXX?