член структуры и boost::hana::filter


person yarrr    schedule 10.07.2017    source источник
comment
Я не совсем уверен, какова цель этого кода.   -  person Bartek Banachewicz    schedule 10.07.2017
comment
У меня есть кортеж constexpr с некоторыми структурами, и я хочу, чтобы их подмножество зависело от их поля-члена во время компиляции.   -  person yarrr    schedule 10.07.2017


Ответы (2)


В лямбде, которую вы передаете hana::filter, у вас есть две проблемы:

  1. Параметр file не является constexpr
  2. Возвращаемое значение не является значением времени компиляции, которое IntegralConstant преобразуется в bool, как того требует hana::filter.

Один из способов сохранить элементы кортежа constexpr в любом контексте — обернуть их в лямбда-выражения constexpr (добавлено в C++17).

Следующий код решает обе проблемы:

constexpr auto files = hana::make_tuple(
  []{ return File(State::Closed); }
, []{ return File(State::Open); }
);

constexpr auto filtered = hana::filter(files, [](auto file) {
  return hana::bool_c<file().state() == State::Open>;
});
person Jason Rice    schedule 15.07.2017
comment
Это круто и совершенно неинтуитивно: вы не можете передать переменную, но вы можете передать лямбду, которая возвращает эту переменную. Благодарю вас! - person yarrr; 17.07.2017

Вам нужно закодировать State как часть типа File:

template <State TState>
struct File 
{
    constexpr State state() const { return TState; }
};

Затем вам нужно вернуть дружественное время компиляции логическое значение из вашей функции фильтрации:

constexpr auto files = hana::make_tuple(File<State::Closed>{}, File<State::Open>{});
constexpr auto filtered = hana::filter(files, [](const auto& file) 
{
    return hana::bool_c<decltype(file){}.state() == State::Open>;
});

живой пример на wandbox

person Vittorio Romeo    schedule 10.07.2017
comment
Да, это то, что я имею в виду под значением как тип. Печально, если есть только вариант :( - person yarrr; 10.07.2017
comment
@yarr: вам нужны вычисления во время выполнения или во время компиляции? - person Vittorio Romeo; 10.07.2017
comment
Только время компиляции. - person yarrr; 10.07.2017