如何定义一个可以保存可变参数模板参数的类?

时间:2017-03-26 08:15:05

标签: c++ class variadic-templates definition c++17

template<typename... Args>
struct A
{
    Args&... args_;
    //
    // error : only function and template parameters can be parameter packs
    //

    A(Args&... args) : args_(args)
    {}
};

int main()
{
    auto a = A(1, 2, 3);
}

我的编译器为clang 5.0 -std=c++1z

如何定义一个可以在这种情况下保存可变参数模板参数的类?

1 个答案:

答案 0 :(得分:7)

据我所知,这是不可能的。您必须使用std::tuple来存储参数:

template<typename... Args>
struct A
{
    std::tuple<std::decay_t<Args>...> args_;

    A(Args&&... args) : args_(std::make_tuple(std::forward<Args>(args)...))
    {}
};

从C ++ 17开始,您可以将std::apply用于args_作为参数的cal函数,而不是将它们解包:

std::apply(func, args_);