【发布时间】:2012-12-11 11:38:14
【问题描述】:
我知道以前有人问过这个问题,但尽管我是一个相当有经验的编码员,但我不明白答案,也没有办法回答这些以前的问题以要求澄清。没有“回复”链接或任何东西。此外,这些问题已经很老了。所以,我重新提出这个问题。
我有一个类,我在其中重载了 += 运算符。我希望一个重载采用裸函数指针,另一个采用 std::function:
void operator+=(void (*handler)());
void operator+=(function<void (void *, T)> handler);
用法:
MyClass a;
a += [](){ DoSomething(); };
a += [](void *x, T y){ DoSomething(); };
很遗憾,代码无法编译,因为编译器无法确定第二个重载不适合第一个 += 调用。
如何定义我的 operator+= 成员函数来纠正这个问题?我不想更改运算符的使用方式(例如,通过使用显式强制转换)。我希望它们能像上面演示的那样工作。
此外,还有以下重载也很方便:
void operator+=(function<void()> handler);
但同样,我不能根据函数模板的签名重载。
有关更多示例,请参阅此线程:Isn't the template argument (the signature) of std::function part of its type? (我尝试实现该线程中提到的各种解决方案,它们都无法编译)
多年来我一直在使用多种语言进行编程,但我的 C++ 技能有点生疏。
【问题讨论】:
-
大 的问题是:你打算在你的重载
operator+=中使用给定的函数指针或std::function对象做什么? -
@zaufi:我看不出这有什么关系,但没关系。我将把它添加到事件处理函数的 std::vector 中。我本质上是在 C++ 中实现 .NET 事件。因为事件和属性(如闭包)对于现代编程语言来说绝对是必不可少的功能。
-
那么,你必须有一个
std::vector用std::function实例化,并带有一个(我建议void())签名......我说的对吗? -
@zaufi:我不确定我是否跟随。每当我调用 += 运算符时,我都希望将传递的函数(或原始函数指针)添加到函数向量中。问题是让编译器选择正确的重载。
标签: c++ lambda overloading signature