【发布时间】:2017-07-23 08:46:46
【问题描述】:
我有以下:
struct Args;
template <typename T>
void DoStuff(T&& callback) {
// ... do stuff
MyArgs args = ...
callback(args);
}
太好了,我可以做到以下几点:
void callback(const Args &);
DoStuff(callback);
还有:
DoStuff([](const Args &) { ... });
还有:
class CallbackClass {
operator()(const Args &);
};
CallbackClass myCallbackClass;
DoStuff(myCallbackClass);
一切都很好,现在我想在这里做两个改进:
-
强制
T的签名始终为void(const Args &),因为在当前状态下,我可以执行以下操作:void badCallback(Args); DoStuff(badCallback); -
允许(除了前面的选项)传递一个具有特定命名成员函数的对象,该成员函数也将被允许作为回调,例如:
class NamedCallback { void PerformCallback(const Args &); }; NamedCallback myNamedCallback; DoStuff(myNamedCallback);
有可能吗?
【问题讨论】:
-
为什么不使用
std::function而不是原始函数指针? -
@user0042 - 什么原始函数指针?此模板接受任何可调用类型。
-
因为我不喜欢每次想要
DoStuff()时都构造一个新对象的想法,所以这里有个很好的问题,std::function会产生多少开销? -
@Vraiment - 不,这是过早优化的问题。正确的问题是“我是否需要
std::function的类型擦除功能,还是让我的整个函数成为一个足够好的模板,尽管可能出现代码膨胀”?。 -
@StoryTeller 好点,我想你是对的。这解决了我的第一个问题,通过使用
std::function我可以强制执行回调签名
标签: c++ templates overloading