Variadic Templates を展開して関数を評価する
戻り値型が void の場合はこんな感じかしら。
[ソース]
#include <iostream> #include <initializer_list> template<typename T> void expand(std::initializer_list<T>){} template<typename T> void disp_impl(T t){ std::cout << t << std::endl; } template<typename ...Args> void disp(Args... args){ expand({ (disp_impl(args), 0)... }); // expand を使いたくないならば // auto n = { (disp_impl(args), true)... }; } int main(){ disp("hello", 42, "world"); return 0; }
[出力]
hello 42 world
カンマ演算子を利用して、ダミーの値を使用しています。
関数の評価自体はされるのでこれで問題ないかな。
ちなみに Boost.Fusion を使うとこんな感じです。
#include <iostream> #include <boost/fusion/include/for_each.hpp> #include <boost/fusion/adapted/std_tuple.hpp> struct disp_impl{ template<typename T> void operator ()(T&& t) const{ std::cout << t << std::endl; } }; template<typename ...Args> void disp(Args... args){ boost::fusion::for_each(std::make_tuple(args...), disp_impl()); } int main(){ disp("hello", 42, "world"); return 0; }
Boost 1.48.0 から std::tuple のアダプタが追加されたので Variadic Templates も使用することが出来ます。
こっちの方がスマートかなー。