【问题标题】:Convert tuple to variant将元组转换为变体
【发布时间】:2018-05-15 22:27:35
【问题描述】:

我有以下类型

using MyTuple=std::tuple<std::vector<char>,std::vector<double>,std::vector<int>>;

如何编写将 MyTuple 转换为以下类型的元函数?

std::variant<std::monostate,char,double,int> 

【问题讨论】:

  • 你有没有尝试写点什么?你被什么困住了?
  • 如何将这样的tuple 转换为这样的variant 是没有意义的。由于这些vectors 中的任何一个或全部可能有数据,因此尚不清楚variant 的内容是什么。如果它们有多个元素,等效的 variant 将如何存储?
  • @NicolBolas OP 确实询问了用于类型计算的 meta 函数

标签: c++ metaprogramming c++17


【解决方案1】:
#include <vector>
#include <tuple>
#include <variant>

template <typename Tuple>
struct get_variant;

template <typename... Ts>
struct get_variant<std::tuple<Ts...>>
{
    using type = std::variant<std::monostate, typename Ts::value_type ...>;
};


using MyTuple = std::tuple<std::vector<char>,std::vector<double>,std::vector<int>>;
using MyVariant = typename get_variant<MyTuple>::type;

using Expected = std::variant<std::monostate,char,double,int>;
static_assert(std::is_same_v<Expected, MyVariant>);

live example

【讨论】:

    【解决方案2】:

    您可以使用函数声明(无需定义)、一些模板机制和decltype 来做到这一点。
    例如,这是一个不会停留在向量的确切数量上的解决方案(但如果需要,您可以轻松地强制它):

    template<typename... T>
    std::variant<std::monostate, T...>
    f(std::tuple<std::vector<T>...>);
    
    template<typename T>
    using to_variant = decltype(f(std::declval<T>()));
    

    这是一个最小的工作示例:

    #include<tuple>
    #include<variant>
    #include<vector>
    #include<utility>
    #include<type_traits>
    
    template<typename... T>
    std::variant<std::monostate, T...>
    f(std::tuple<std::vector<T>...>);
    
    template<typename T>
    using to_variant = decltype(f(std::declval<T>()));
    
    using MyTuple = std::tuple<std::vector<char>,std::vector<double>,std::vector<int>>;
    
    int main() {
        static_assert(std::is_same_v<
            to_variant<MyTuple>,
            std::variant<std::monostate,char,double,int>
        >);
    }
    

    wandbox 上查看并运行它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多