2010-09-18 97 views
8

我想用可變參數列表編寫一個函數。我想探索我的選擇。我很確定我來過一個專爲此目的而設計的boost模板類,但我想不出它的名字?誰能告訴我?還是我夢想這一點! 謝謝變量參數列表與提升?

+0

你的意思是變量參數計數,但一種類型,或者也是任意類型? – 2010-09-19 00:35:30

+0

我不確定庫提供了什麼,我似乎無法重新定位它,我想這是對va_list的某種改進 - 可能是類型安全 – aukm 2010-09-19 00:56:12

+0

您的函數只需要接受一種類型的參數嗎? – 2010-09-19 01:00:13

回答

7

如果你只需要接受一個相同類型的參數的變量數,取一個容器是常見的事情。使用Boost.Assign容器但是可以得到緩解的創作:

void f(const std::vector<int>& vec) {} 
f(boost::assign::list_of(1)(2)(3)(4)); 

或者你可以去操作符重載(的operator()operator<<如)自己,類似於標準庫流所採取的做法:

op() << arg1 << arg2 << arg3; 

如果您確實想提供類型安全的可變參數函數(不使用C++ 0x功能),Boost.Preprocessor可以提供幫助。一個通用的例子:

#define OUT(z, n, name) << name ## n 

#define MAKE_FUNC(z, n, unused)          \ 
    template<class T BOOST_PP_ENUM_TRAILING_PARAMS(n, class T)>  \ 
    void func(T t BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(n, T, t)) { \ 
     std::cout << t BOOST_PP_REPEAT(n, OUT, t) << std::endl;  \ 
    } 

BOOST_PP_REPEAT(9, MAKE_FUNC, ~) // generates func() versions taking 1-10 arguments 
func(1, "ab", 'c'); // prints "1abc"