boost :: hana распаковка кортежей для создания вариационных шаблонов

Относится к этот вопрос Мне было интересно, если бы что-то подобное можно было достичь простым способом, используя boost :: hana:

#include <boost/hana.hpp>
#include <boost/hana/unpack.hpp>

namespace hana = boost::hana;

template<typename ... T>
struct A {};

int main() {

auto my_tuple = hana::tuple_t<int, double, float>;

// Is there any way to unpack my_tuple as template arguments for A?
// Something like
using MyStruct = A<hana::unpack_types(my_tuple)...>;

static_assert(std::is_same<MyStruct, A<int, double, float>>::value, "Ooops!");
}

2

Решение

использование template_ поднимать A в метафункцию, затем позвоните unpack:

using MyStruct = decltype(hana::unpack(my_tuple, hana::template_<A>))::type;

пример.

7

Другие решения

Вы можете сделать это самостоятельно с:

 template <template <typename...> class C, typename Tuple> struct RebindImpl;

template <template <typename...> class C, typename ... Ts>
struct RebindImpl<C, hana::tuple_t<Ts...>>{
using type = C<Ts...>;
};

template <template <typename...> class C, typename Tuple>
using Rebind = typename RebindImpl<C, Tuple>::type;
1

Простой способ сделать это, если все, что вам нужно, это получить правильный тип:

template <typename... Args>
constexpr A<Args...> make_A(hana::tuple_t<Args...>) {
return {};
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector