[英]How do I create an std::tuple<> from a variadic template parameter?
我有一个用这个模板声明的类: 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)...);
}
这有点冗长,但会避免那些不必要的副本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.