2012-07-30 52 views
1

因此,經過一段時間的擺弄之後,我無法得到它......爲什麼這還不是標準的一部分?將函數返回給接受void的函數?

template<class T> accept_all(T) {} 
void give_void() {} 
int give_int() { return 1;} 

int main() { 
accept_all(give_void()); 
accept_all(give_int()); 
} 

這將節省相當多的使用模板類特麻煩的......而在一般的語法而言,這是毫無意義的能夠返回void,並且不能夠傳遞一個。

有沒有什麼我可以做,不涉及專門爲每種方法類型的醜陋的「調解員類」調用這個東西?

謝謝。

編輯: 什麼是實現接受任何函數返回值的模板的好方法呢?

+0

你爲什麼要實現一個接受任何函數返回值的函數? – akappa 2012-07-30 12:21:05

+0

問題是'void'不是一個值,它根本就沒有任何價值。如果你看'give_void',它不會返回任何東西。 – 2012-07-30 12:26:04

回答

3

我覺得這看起來很奇怪。爲什麼不連續調用這些函數:

give_void(); 
accept_void(); 

更乾淨。

實際上,通過輸入accept_void(give_void());即可保存任何內容,即使您需要輸入的符號數量相同。

編輯不知道我真的瞭解你想要達到的目標,但:

template <typename Result, typename Callable> 
static Result func(Callable c) 
{ 
    return c(); 
} 
+0

看看我的編輯。 – ActiveTrayPrntrTagDataStrDrvr 2012-07-30 12:19:46

+0

@ user1240436:看到我的編輯請 – Andrew 2012-07-30 12:23:43

0

C++允許你return void從功能(參見Is returning void valid code?)。

但是,返回空白與接受空白顯着不同;注意int foo(void)只是爲int foo()備用(和不建議使用)語法,只存在與C

你的建議打破不變的是,在函數調用的參數個數相同數量的兼容性的歷史原因該函數接受的參數。

+0

該標準令人困惑(一如既往)。我的生活會更簡單,如果傳遞一個虛空永遠不會是一個「真實的」論點,而是一個表達假人的語法工具。在代理模板類處理特殊情況和使用void參數作爲模板語法的擴展的語言之間,我有些勉強。 – ActiveTrayPrntrTagDataStrDrvr 2012-11-01 12:51:58