可変長引数を扱う手段として 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
あまり書きたくありませんね