将元组转换为变体
Convert tuple to variant
我有以下类型
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上启动并运行。
相关文章:
- 将元组的向量转换/构造为堆
- 如何在编译时将齐次元组转换为数组?
- Boost.Hana:在 constexpr 上下文中将值元组转换为相应类型的元组
- 将多个数组转换为元组
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- 为什么此元组到引用元组 (std::tie) 转换有效?
- 将树转换为元组的编译时转换
- 如何将标准::数组转换为标准::元组?
- 如何将元组转换为C 11中的字节数组
- 元组尺寸默认构造函数及其转换为std :: size_t
- 使用 hana::transform 在 C++14 中转换元组内的类型
- 将STD ::变体转换为STD ::模板类实例的元组
- 将 integral_constants 元组转换为整数元组
- 错误:无法从"元组<[...]、std::__1::元组<无符号长长、无符号长长>>"到"常量元组<[...],uint_type>"的可行转换
- 将元组转换为变体
- Boost::P ython,将元组转换为Python有效,矢量<tuple>不
- 有没有一种方法可以将左值和右值的列表分别转换为具有引用类型和完整类型的元组
- 等价于元组的std::转换
- 将元组转换为函数参数
- 转换元组类型