如何从可变模板参数创建 std::tuple<>?
How do I create an std::tuple<> from a variadic template parameter?
我有一个使用此模板声明的 class:template <typename ...Args>
。在其中,我有一个声明为 std::vector<std::tuple<Args...>> vec;
的列表,用于存储模板指定的数据条目。我还有一个函数声明如下:
void AddVertex(Args... data)
{
// vec.push_back(std::tuple<Args...>(data));
}
在此函数中,我想将一个 Args... 元组添加到向量中。这可能吗?我试过使用评论中的代码,但编译器给我一个错误,说 "the parameter pack must be expanded in this context".
This解决方案不起作用,因为元组的模板参数已经展开。
您需要同时展开:
- 模板参数包(
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)...);
}
这有点冗长,但会避免那些不必要的副本。
我有一个使用此模板声明的 class:template <typename ...Args>
。在其中,我有一个声明为 std::vector<std::tuple<Args...>> vec;
的列表,用于存储模板指定的数据条目。我还有一个函数声明如下:
void AddVertex(Args... data)
{
// vec.push_back(std::tuple<Args...>(data));
}
在此函数中,我想将一个 Args... 元组添加到向量中。这可能吗?我试过使用评论中的代码,但编译器给我一个错误,说 "the parameter pack must be expanded in this context".
This解决方案不起作用,因为元组的模板参数已经展开。
您需要同时展开:
- 模板参数包(
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)...);
}
这有点冗长,但会避免那些不必要的副本。