Цикл constexpr без содержимого constexpr

Я хочу использовать boost hana для генерации этого окончательного кода:

template < typename ... Ts >
void  foo(Ts ... data) {

  constexpr auto tuple = hana::make_tuple(data...);

  //Code that I need to be generate
  container_c[tuple[0_c]].foo2();
  container_c[tuple[1_c]].foo2();
  container_c[tuple[2_c]].foo2();
}

container_c - это карта, генерируемая во время компиляции, хотя я не думаю, что это действительно имеет значение. foo2 не является constexpr.

Я думал использовать hana::size(tuple).times, но мне нужно приращение, вероятно, используя hana::make_range(hana::size_c<0>, hana::size(tuple)), и я не знаю, как это сделать.

Я надеялся найти функцию, которая позволит мне выполнять функцию для каждого члена моего кортежа внутри ханы. Что-то вроде hana::transform, но для недействительной лямбды.

Я не ожидал, что мне будет трудно найти, как это сделать с Hana, должен ли я просто использовать специализацию, как в старые времена?

Кстати, прямо сейчас я использую gcc 7.1, но вы можете работать с предположением, что у меня нет ограничений компилятора.


person Mathieu Van Nevel    schedule 13.08.2017    source источник
comment
@JasonRice, как я не смог найти это в документации по хане ... Спасибо за комментарий! Но все же хорошая идея спросить об этом, потому что я нашел еще лучшее решение (я думаю).   -  person Mathieu Van Nevel    schedule 14.08.2017


Ответы (1)


Чтобы перебрать ваш data, вы можете сделать

template < typename ... Ts >
void  foo(Ts ... data) {
    int dummy[] = {0, (container_c[data].foo2(), void(), 0)...};
    static_cast<void>(dummy); // Avoid warning for unused variable.
}

Or in C++17

template < typename ... Ts >
void  foo(Ts ... data) {
    (static_cast<void>(container_c[data].foo2()), ...);
}
person Jarod42    schedule 13.08.2017
comment
Обратите внимание, что выражения C++17 fold делают это намного менее уродливым, если компилятор OP их поддерживает. - person ; 13.08.2017
comment
Похоже, вы хотите инициализировать массив для повторения? Но я вообще не понимаю этот синтаксис. И цикл будет выполняться во время выполнения, тогда нет? Кстати, у меня нет никаких ограничений на компилятор, поэтому я отредактирую свой вопрос. - person Mathieu Van Nevel; 13.08.2017
comment
@hvd: добавьте версию С++ 17. - person Jarod42; 13.08.2017
comment
О, я получил это с версией C ++ 17 :) Спасибо, я пробовал что-то подобное, мне нужно больше узнать о выражениях fold. - person Mathieu Van Nevel; 13.08.2017