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



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

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

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

此解决方案不起作用,因为元组的模板参数已展开。

您需要展开两者:

  • 模板参数包 (Args...(

  • 函数参数包 (data...(:

所以它应该是:

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

或更短的形式,使用make_tuple

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

正如编译器所暗示的,您需要扩展参数包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)...);
}

这有点冗长,但可以避免那些不必要的副本。

相关内容

  • 没有找到相关文章

最新更新