2017-01-10 2 views
1

У меня есть hana::tuple_t<int, char, double, float>, и я хочу использовать его для создания hana::tuple<int, char, double, float>.Переход от hana :: tuple_t к hana :: tuple

Я думал, что использование hana::to<hana::tuple_tag> превратит hana::tuple_t<int, char, double, float> в hana::tuple<int, char, double, float>; но это не так, поскольку следующее всегда терпит неудачу:

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

BOOST_HANA_CONSTANT_ASSERT(
    hana::to<hana::tuple_tag>(oType) 
    == 
    hana::make_tuple(1, 'C', 1.0, 1.0f) 
); 

Я также попытался использовать hana::transform, но не повезло (хотя я подозреваю, что я делаю это неправильно):

auto vecs = hana::transform(typeList, [](auto t) { 
    return typename decltype(t)::type{}; 
}); 

Итак, как мне превратить hana :: tuple_t в hana :: tuple?

+1

Инициализация по умолчанию даст значение '0', а не' 1' (или '1.0', или' 'C''). Вы пытались сравнить его с кортежем 'hana :: make_tuple (0, '\ 0', 0.0, 0.0f)'? – Cornstalks

+0

Да, я пробовал это. Ошибки компилятора: Уровень \t \t static_assert failed "hana :: to (oType) == hana :: make_tuple (0, 0.0, 0.0f)" – Acorn

ответ

2

Я верю, что вы действительно хотите, здесь что-то вроде

#include <boost/hana.hpp> 
namespace hana = boost::hana; 

constexpr auto types = hana::tuple_t<int, char, double, float>; 
using Tuple = decltype(hana::unpack(types, hana::template_<hana::tuple>))::type; 
// Tuple is hana::tuple<int, char, double, float> 
// Now you can create such a tuple as you wish: 
Tuple ts{1, 'x', 2.2, 3.4f}; 

вещей, как hana::template_ и hana::metafunction были построены точно, чтобы сделать эту интероперабельности с типами легко.

3

hana::tuple_t - это просто переменная шаблона, которая сама по себе является hana::tuple, поэтому преобразование в hana::tuple ничего не изменит.

template <typename ...T> 
constexpr hana::tuple<hana::type<T>...> tuple_t{}; 

Как уже упоминалось в комментариях, ваш призыв к hana::transform умолчанию инициализирует каждый элемент таким образом можно было бы ожидать значения, такие как 0 для целочисленных типов.

Кроме того, вы используете BOOST_HANA_CONSTANT_ASSERT, который проверяет только значения времени компиляции. Raw int, char, double и float значения не будут constexpr.

BOOST_HANA_RUNTIME_ASSERT работает для значений времени выполнения:

#include <boost/hana.hpp> 

namespace hana = boost::hana; 

constexpr auto types = hana::tuple_t<int, char, double, float>; 

struct init_from_type_fn 
{ 
    template <typename Type> 
    constexpr auto operator()(Type) const 
    { 
    return typename Type::type{}; 
    } 
}; 

constexpr init_from_type_fn init_from_type{}; 

int main() 
{ 
    BOOST_HANA_RUNTIME_ASSERT(
    hana::equal(
     hana::transform(types, init_from_type), 
     hana::make_tuple(0, '\0', 0.0, 0.0f) 
    ) 
); 
} 
+0

Похож, проблема в MSVC w/Clang , Это просто не нравится этот код, но он отлично работает на моем vm, используя Clang. – Acorn

+0

Какая ошибка? Может быть, это не специфицировано 'C++ 14'? Я не использую MSVC, но я слышал о людях, использующих Hana. –

+0

Это команда clang frontend из-за использования сигнала. Из того, что я собрал, компилятор запутывается, когда пытается собрать все вместе. Невозможно бросить '-v' afaik, поэтому я рассматривал его как кирпичную стену. – Acorn

Смежные вопросы