如何使运算符具有显式参数c ++

how to make a operator have an explicit parameter c++

考虑一些代码:

void foo() { }
bool bar() { return true; }

struct S
{
    void operator=(std::function<void()> f){f();};
    void operator=(std::function<bool()> f){f();};      
};

int main() {
    S s;
    s = foo; // ok
    s = bar; // error: use of overloaded operator '=' is ambiguous
}    

如何使这个示例明确无误?

你 运行 遇到的问题是允许 std::function<void(Args...)> 丢弃 return 类型 - 所以 std::function<void()>std::function<bool()> 都可以构造来自 bool(*)()。后者将从 bar 通过 return 转发,但前者只会丢弃它。这是完全有效的行为,但会导致模棱两可。

您可能想要完全避免 std::function

template <class F>
void operator=(F f) { f(); }