кто-то уже задавал этот вопрос, но ветка закончилась тем, что исходный вопрос не получил ответа.
предположим, у вас есть это:
template<size_t i, class f_type>
void call_with_i(f_type f);
functor_type это либо:
a) структура с методом, который имеет следующую подпись:
template<size_t i> operator()() const;
или, б) функцию, которая выглядит следующим образом:
template<size_t i> foo();
Я хочу, чтобы call_with_i <42> (foo) был эквивалентен "foo <42> ()", но я не могу понять правильный синтаксис, чтобы это произошло. Я был бы удовлетворен решением, которое просто (а) , но (а) + (б) было бы здорово . Я уже пробовал эти синтаксисы:
f< i >(); // doesn't work
f()< i >; // doesn't work
f.operator< i >(); // doesn't work
f.operator()< i >; // doesn't work
f.operator()< i >(); // works on msvc, but doesn't work on gcc.
Как вы вызываете operator () с явными аргументами шаблона? Есть ли способ вызвать его так, чтобы тот же синтаксис также вызывал шаблонную свободную функцию?
p.s. Если вам интересно, для чего я это использую, то это потому, что я пишу функцию repeat_to, где repeat_to <10> (f) вызывает f (0), а затем f (1) ... f (10). Я использую это, чтобы перебрать несколько векторов boost :: fusion параллельно по индексу. да, я мог бы использовать итераторы или я мог бы просто использовать именованную функцию-член, но я все еще хочу знать ответ.
редактировать заметку: я вычеркнул вещи, потому что передача шаблонной свободной функции в качестве аргумента не имеет никакого смысла.