可変引数の転送
昨日の続き。
#include <tuple> #include <utility> template <class F, class T0> void variadic_invoke(F f, std::tuple<T0>&& arg) { f(std::get<0>(arg)); } template <class F, class T0, class T1> void variadic_invoke(F f, std::tuple<T0, T1>&& args) { f(std::get<0>(args), std::get<1>(args)); } template <class F, class T0, class T1, class T2> void variadic_invoke(F f, std::tuple<T0, T1, T2>&& args) { f(std::get<0>(args), std::get<1>(args), std::get<2>(args)); } template <class... Args> void do_something(Args&&... args) { } template <class... Args> class functor { std::tuple<Args...> args_; public: functor(Args&&... args) : args_(std::move(args)...) {} // 可変引数をメンバに保持しておいて void operator()() const { // 保持しておいた可変引数を別な関数に渡す variadic_invoke(&do_something<Args...>, std::move(args_)); } }; int main() { functor<int, double>(1, 3.14)(); }
Variadic Templatesの意味がない・・・
やっぱりこうしたい↓
#include <utility> template <class... Args> void do_something(Args&&... args) { } template <class... Args> class functor { Args... args_; public: functor(Args&&... args) : args_(std::move(args)...) {} // 可変引数をメンバに保持しておいて void operator()() const { // 保持しておいた可変引数を別な関数に渡す do_something(args_...); } }; int main() { functor<int, double>(1, 3.14)(); }
結論:可変個メンバ変数ください。