如何从可变参数模板参数创建std :: tuple <>?

时间:2019-12-14 19:25:47

标签: c++ templates visual-c++ variadic-templates variadic-functions

我有一个用此模板声明的类:template <typename ...Args>。在其中,我有一个声明为std::vector<std::tuple<Args...>> vec;的列表,用于存储模板指定的数据条目。我还有一个声明如下的函数:

void AddVertex(Args... data)
{
    // vec.push_back(std::tuple<Args...>(data));
}

在此函数中,我想向向量添加Args ...的元组。这可能吗?我尝试使用注释中的代码,但是编译器给我一个错误,指出“必须在这种情况下扩展参数包”。

This解决方案不起作用,因为元组的template参数已经扩展。

2 个答案:

答案 0 :(得分:2)

您需要同时展开两者:

  • 模板参数包(Args...

  • 功能参数包(data...):

因此应该是:

    vec.push_back(std::tuple<Args...>(data...));

或更短的格式,请使用make_tuple

    vec.push_back(std::make_tuple(data...));

答案 1 :(得分:2)

如编译器所提示,您需要扩展参数包data,这样就可以了:

void AddVertex(Args... data)
{
    vec.push_back(std::tuple<Args...>(args...));
}

另外,请考虑改用emplace_back

void AddVertex(Args... data)
{
    vec.emplace_back(args...);
}

以上两个函数都会复制每个参数,因此不是惯用的C ++。这可能对您来说不是问题。为避免这种情况,请执行以下操作

template <typename... T>
void AddVertex(T&&... args)
{
    vec.emplace_back(std::forward<T>(args)...);
}

稍微冗长一些,但会避免那些不必要的副本。