2016-04-25 37 views
-1

考慮一些代碼:如何使運營商有明確的參數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 
}  

我怎樣才能讓這個例子明確?

+0

也許我失去了一些東西,但怎麼做'S =布爾()'匹配'運營商='了'void'版本?我假設'S = void()'和'S = bool()'你實際上是指更像'S s; s = foo;'和's s; s =吧;',對嗎? –

+0

你可以讓這個[mcve]幷包含你得到的錯誤信息嗎? – NathanOliver

+0

@RemyLebeau,它的確如此,因爲'std :: function'確實輸入了擦除 – WhiZTiM

回答

2

你正在運行到的問題是,std::function<void(Args...)>被允許放棄返回類型 - 這樣既std::function<void()>std::function<bool()>可以從bool(*)()構造。後者將通過bar返回,但前者將丟棄它。這是完全有效的行爲,但會導致它不明確。

你可能想要的是避免std::function乾脆:

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

如果我想讓每個函數都返回不同的東西,該怎麼辦?明確的模板特化將是我的解決方案,但是我必須使用純函數指針嗎? – Julian

+0

@Julian完全取決於你究竟想要做什麼。 – Barry