2013-03-05 33 views
2

編輯:我很高興看到,有一個C++ 11的解決方案。無論如何,還沒有人想出C++ 98的答案。所以,即使我已經接受了答案,問題依然存在。如何創建一個不需要調用者將參數傳遞給它的可變參數?

讓我們假設你有一個命名空間中的一個函數:

namespace Math 
{ 
    int Sum(<params>); 
} 

如何實現這一功能的數學::總和,從而調用者可以使用任意數量的參數調用它尚未調用者不還需要傳遞參數的數量。 來電者還需要在呼叫地點完全符合資格。例如: Math::Sum(2, 4, 6, 8, 10, 12)

+0

宏?可變參數? eurgh,不,謝謝 – 2013-03-05 12:54:58

+0

好吧,有時候,即使在最新的編譯器上,你也需要一些宏魔法來將它們屈服於你的意志;) 特別是當它們不完全符合C++ 11時:( – 2013-03-05 13:23:18

回答

7

這裏是一個工作的一般方法,在C++ 11,與任何類型的輔助添加劑經營者(operator +):

#include <iostream> 
#include <string> 

template<typename T, typename U> 
auto Sum(T&& t, U&& u) -> decltype(t + u) 
{ 
    return (t + u); 
} 

template<typename T, typename... Ts> 
auto Sum(T&& t, Ts&&... ts) -> decltype(
    t + Sum(std::forward<Ts>(ts)...) 
    ) 
{ 
    return t + Sum(std::forward<Ts>(ts)...); 
} 

int main() 
{ 
    std::cout << Sum(1, 2, 3) << std::endl; 
    std::cout << Sum(1.0, 2.0, 3.0) << std::endl; 
    std::cout << Sum(std::string("Hello "), std::string("World!")) << std::endl; 
} 
+0

謝謝。一個觀察結果是,它只適用於編譯器與variadic模板支持,但是它支持多種類型的附加好處我相信 – 2013-03-05 13:02:42

+0

@ Zadirion:是的,我認爲這是可以接受的,因爲你將問題標記爲「C++ 11」 – 2013-03-05 13:04:09

+0

確實這是完全可以接受的。 – 2013-03-05 13:05:25

5

在C++ 11使用std::minstd::max的辦法是採取initializer_list

int Sum(std::initializer_list<int>); 

這是合適的,當所有的參數應該是相同的類型。你會稱其爲Sum({ 1, 2, 3, 4})

+0

有趣。需要在VS2010上使用我的解決方案時,我忘記了即將推出的初始化列表功能。實際上,這就是C++ 11的方式,感謝您的貢獻! – 2013-03-05 12:58:55