【问题标题】:How do I create an std::tuple<> from a variadic template parameter?如何从可变参数模板参数创建 std::tuple<>?
【发布时间】:2020-04-07 20:12:25
【问题描述】:

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

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

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

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

【问题讨论】:

  • 在你的函数中包含真正的向量。显然它不是某处的成员变量。一个 minimal reproducible example 除了推送之外的一切都会做得很好。

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


【解决方案1】:

你需要同时展开:

  • 模板参数包(Args...

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

应该是这样的:

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

或更短的形式,使用make_tuple:

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

【讨论】:

  • 谢谢,std::make_tuple 做到了!
  • std::make_tuple 是错误的,但 Args 是参考。
【解决方案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)...);
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-15
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2016-09-20
    • 2012-01-06
    • 1970-01-01
    相关资源
    最近更新 更多