传递给 std::variant 的预定义类型列表
Predefined type list passed to a std::variant
有什么方法可以创建预定义类型列表,并在 c++ 17 中的 std::variant 中使用这些类型?这是我正在尝试做的事情,它编译了,但没有像我希望的那样工作:
template < class ... Types > struct type_list {};
using valid_types = type_list< int16_t, int32_t, int64_t, double, std::string >;
using value_t = std::variant< valid_types >;
一种方式:
template<class... Types>
std::variant<Types...> as_variant(type_list<Types...>);
using value_t = decltype(as_variant(valid_types{}));
使用 Boost.MP11,这是 mp_rename
:
using value_t = mp_rename< valid_types, std::variant >;
或者,mp_apply
是相同的操作,但操作数翻转,如果您觉得它更具可读性:
using value_t = mp_apply< std::variant, valid_types >;
这可以通过让 type_list
将 Types
发送到元函数 (std::variant
) 来完成:
template < class ... Types > struct type_list {
template < template < class... > class MFn >
using apply = MFn< Types... >;
};
// Optional. For nicer calling syntax:
template < template < class... > class MFn, class TypeList >
using apply = typename TypeList::template apply< MFn >;
using valid_types = type_list< int16_t, int32_t, int64_t, double, std::string >;
using value_t = apply< std::variant, valid_types >;
如果您可以扩充 type_list 结构:
template <class ... Types> struct type_list {
using variant_type = std::variant< Types...>;
};
如果你想把它作为一个单独的函数:
template <class T> struct type_list_variant;
template <class... Types> struct type_list_variant<type_list<Types...>> {
using type = std::variant<Types...>;
};
template <class T>
using type_list_variant_t = typename type_list_variant<T>::type;
这是我所知道的最短、最简洁的方法:
template < class ... Types > struct type_list {
template<template<class...>class Z>
using apply_to = Z<Types...>;
};
using value_t = value_types::apply_to<std::variant>;
你可以变得更漂亮。例如:
template<class T, template<class...>class Z>
struct transcribe_parameters;
template<class T, template<class...>class Z>
using transcribe_parameters_t = typename
transcribe_parameters<T,Z>::type;
template<template<class...>class Zin, class...Ts, template<class...>class Zout>
struct transcribe_parameters<Zin<Ts...>, Zout> {
using type=Zout<Ts...>;
};
这给你:
using value_t = transcribe_parameters_t<value_types, std::variant>;
但是,将其作为 type_list
的内置功能似乎并不合理。
有什么方法可以创建预定义类型列表,并在 c++ 17 中的 std::variant 中使用这些类型?这是我正在尝试做的事情,它编译了,但没有像我希望的那样工作:
template < class ... Types > struct type_list {};
using valid_types = type_list< int16_t, int32_t, int64_t, double, std::string >;
using value_t = std::variant< valid_types >;
一种方式:
template<class... Types>
std::variant<Types...> as_variant(type_list<Types...>);
using value_t = decltype(as_variant(valid_types{}));
使用 Boost.MP11,这是 mp_rename
:
using value_t = mp_rename< valid_types, std::variant >;
或者,mp_apply
是相同的操作,但操作数翻转,如果您觉得它更具可读性:
using value_t = mp_apply< std::variant, valid_types >;
这可以通过让 type_list
将 Types
发送到元函数 (std::variant
) 来完成:
template < class ... Types > struct type_list {
template < template < class... > class MFn >
using apply = MFn< Types... >;
};
// Optional. For nicer calling syntax:
template < template < class... > class MFn, class TypeList >
using apply = typename TypeList::template apply< MFn >;
using valid_types = type_list< int16_t, int32_t, int64_t, double, std::string >;
using value_t = apply< std::variant, valid_types >;
如果您可以扩充 type_list 结构:
template <class ... Types> struct type_list {
using variant_type = std::variant< Types...>;
};
如果你想把它作为一个单独的函数:
template <class T> struct type_list_variant;
template <class... Types> struct type_list_variant<type_list<Types...>> {
using type = std::variant<Types...>;
};
template <class T>
using type_list_variant_t = typename type_list_variant<T>::type;
这是我所知道的最短、最简洁的方法:
template < class ... Types > struct type_list {
template<template<class...>class Z>
using apply_to = Z<Types...>;
};
using value_t = value_types::apply_to<std::variant>;
你可以变得更漂亮。例如:
template<class T, template<class...>class Z>
struct transcribe_parameters;
template<class T, template<class...>class Z>
using transcribe_parameters_t = typename
transcribe_parameters<T,Z>::type;
template<template<class...>class Zin, class...Ts, template<class...>class Zout>
struct transcribe_parameters<Zin<Ts...>, Zout> {
using type=Zout<Ts...>;
};
这给你:
using value_t = transcribe_parameters_t<value_types, std::variant>;
但是,将其作为 type_list
的内置功能似乎并不合理。