読者です 読者をやめる 読者になる 読者になる

可変引数の転送

C++

昨日の続き。

#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)();
}

結論:可変個メンバ変数ください。