【问题标题】:How to unpack std::tuple from C++ template?如何从 C++ 模板中解压 std::tuple?
【发布时间】:2020-04-16 23:13:48
【问题描述】:

我有一个类应该将某些类型的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++ templates tuples c++17


    【解决方案1】:

    是的,为了补充 cigien 的答案,另一种解决方法是通过模板专业化解包。

    template<typename Tuple>
    class MyClass;
    
    template<typename... Ts>
    class MyClass<std::tuple<Ts...>>
    {
        // ...
        using VectorTuple = std::tuple<std::vector<Ts>...>;
        // ...
    };
    

    【讨论】:

    • 不错。这是一个优雅的解决方案。 +1
    【解决方案2】:

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

    // 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; 
    };
    

    现在您可以使用tuple 实例化MyClass,如下所示:

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

    其中包含一个字段my_tuple

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

    这是一个有效的demo

    【讨论】:

    • 我会接受 Travis 的回答,因为我发现它稍微优雅一些​​。不过,也非常感谢。
    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2016-03-15
    • 2012-01-06
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多