可変長引数を扱う手段として Fusion を使う
Variadic Template による可変長引数 ...args は f(args)... で f(a1), ..., f(aN) に展開できますが
template <class ...Args> void fg(Args ...args) { f(g(args)...); // f(g(a1), ..., g(aN)) }
少し込み入ったことをする場合は、引数を Boost.Fusion の列にまとめてから操作することができます
例えば (a1, ..., aN) => a1 + ... + aN という関数を書きたい場合
namespace fusion = boost::fusion; using namespace boost::phoenix::placeholders; template <class A1, class ...Args> auto plus(A1 const &a1, Args const &...args) -> decltype(fusion::fold(fusion::vector_tie(args...), a1, _1 + _2)) { return fusion::fold(fusion::vector_tie(args...), a1, _1 + _2); }
fusion::fold を使い、演算子 (+) と初期値 a1 で列 [a2, ..., aN] を畳み込んでいます
(引数の無駄なコピーを防ぐためには *_tie を使うと良いでしょう)
Perfect forwarding を行いたい場合は PP に頼ることになるかもしれませんが
http://ideone.com/sUOIn
あまり書きたくありませんね