4

有没有办法创建一个预定义的类型列表,并在 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 >;
4

5 回答 5

6

单程:

template<class... Types> 
std::variant<Types...> as_variant(type_list<Types...>);

using value_t = decltype(as_variant(valid_types{}));
于 2019-01-25T18:24:18.550 回答
3

这可以通过将type_listsend 发送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 >;

螺栓链接

于 2019-01-25T18:32:07.853 回答
1

使用 Boost.MP11,这是mp_rename

using value_t = mp_rename< valid_types, std::variant >;

螺栓链接


或者,mp_apply如果您发现它更具可读性,是否与翻转操作数的操作相同:

using value_t = mp_apply< std::variant, valid_types >;
于 2019-01-25T18:24:28.750 回答
1

这是我所知道的最短、最简洁的方法:

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似乎并非不合理。

于 2019-01-25T18:37:35.847 回答
0

如果您可以扩展您的 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;
于 2019-01-25T18:35:41.763 回答