首页 > 解决方案 > 如何从 C++ 模板中解压 std::tuple?

问题描述

我有一个预计将采用std::tuple某些类型(允许任意计数)作为模板参数的类。我想声明一个类型的向量元组。例如,我有

template <typename T>
class MyClass {/*...*/}

我实例化它

MyClass<std::tuple<int, bool>> my_class;

我的目标是创建一个这样的领域

std::tuple<std::vector<int>, std::vector<bool>> my_tuple;

我知道如果我有一个类定义

template <typename... T>
class MyClass2 {/*...*/}

我可以通过传递没有元组的数据类型来实例化它

MyClass<int, bool> my_class2;

然后简单地创建字段

std::tuple<std::vector<int>, std::vector<bool>> my_tuple2;

使用

std::tuple<std::vector<T>...> my_tuple2;

因此,我在想我应该以某种方式从元组中解压缩数据类型。可能吗?

标签: c++templatestuplesc++17

解决方案


当然,您只需要另一个级别的间接(像往常一样):

// this function declaration is used just for the type
// transformation, and needs no definition
template <typename... Types>
auto unpack(std::tuple<Types...>) -> std::tuple<std::vector<Types>...> ;

template <typename Tuple>
class MyClass
{
  // use the return type of unpack
  decltype(unpack(std::declval<Tuple>())) my_tuple; 
};

现在您可以使用 实例化MyClasstuple如下所示:

MyClass<std::tuple<int, double>> m;

其中包含一个my_tuple类型的字段

std::tuple<std::vector<int>, std::vector<double>>

这是一个工作演示


推荐阅读