如何使运算符具有显式参数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(); }
考虑一些代码:
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(); }