Допустим, у меня есть какое-то действие, которое нужно выполнить во время компиляции:
enum class Action {A, B};
Теперь я пишу шаблонную переменную, которая выполняет возможную комбинацию действий в последовательности:
template <Action a>
void applyAction();
template <typename = void>
void applyActions() {}
template <Action a, Action... as>
void applyActions() {
applyAction<a>();
applyActions<as...>();
}
Этот код в порядке.Действительно:
void foo() {
applyActions<Action::A, Action::B>();
}
правильно генерирует:
call void applyAction<(Action)0>()
call void applyAction<(Action)1>()
Пример GodBolt здесь
Чтобы добиться завершения пакета расширения,Мне пришлось объявить фиктивную функцию:
template <typename = void> void applyActions() {}
, что для меня довольно "уродливо", поскольку дает возможность вызывать универсальный тип.
В C ++ 11, есть ли способ объявить переменную функцию, которая принимает пустой пакет параметров?
Конечно, ее объявление не должно приводить к неоднозначности вызова с необходимой функцией:
template <Action a, Action... as>
void applyActions();
Что-то вроде:
template <Action.. = {}>
void applyActions() {}
Здесь не компилируемый пример из-за неоднозначности вызовов.Но это дает представление о том, чего я хочу достичь.