将元组转换为变体

Convert tuple to variant

本文关键字:转换 元组      更新时间:2023-10-16

我有以下类型

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

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

std::variant<std::monostate,char,double,int> 
#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>);

实时示例

您可以使用函数声明(无需定义),一些模板机械和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上启动并运行。