2015-02-24 66 views
-3

當編寫一個函數模板應該返回任何一個傳遞功能的回報 - 我怎樣才能避免該return語句不能用函數返回void使用的事實呢?避免特殊情況下`void`返回類型函

例子:

struct FunctionalVoid { 
    typedef void result_type; 
    result_type foo() const { return; } 
}; 

struct FunctionalInt { 
    typedef int result_type; 
    result_type foo() const { return 42; } 
}; 

template< class F > 
typename F::result_type 
g (const F & f) { 
    return f.foo(); 
} 

現在我可以寫g (FunctionalInt {});,但我不能寫g (FunctionalVoid {});。如果不寫g兩次,有沒有辦法解決這個問題?

(一個真正的g會,當然是更復雜的功能。)

(編輯:愚蠢減少 - 成員函數調用foo,而不是do。)

+5

你被允許從'void'函數返回一個'void'表達。你嘗試過什麼錯誤? (也許你可以發佈你實際測試過的代碼,沒有像試圖命名一個函數'do'的額外錯誤)。 – 2015-02-24 11:08:28

+1

由此,jrok並不意味着您的5,000線項目。他的意思是你構建的MCVE來調試這個。它與上面的代碼非常相似,除了沒有被破壞,並且具有'main'功能。 – 2015-02-24 11:11:35

+0

http://stackoverflow.com/q/20478193/560648 – 2015-02-24 11:18:33

回答

6

你不需要至!

return void()有效(在返回void功能),允許在於此。

你在不是允許做的是命名一個函數do,因爲這是一個關鍵字。

所以,當我重新命名dofoo,並添加以下main功能,the only diagnostics emitted by my compiler are warnings about an unused variable

int main() 
{ 
    FunctionalVoid obj1; 
    g(obj1); 

    FunctionalInt obj2; 
    int result2 = g(obj2); 
}