Я экспериментирую с метапрограммированием и вариационными шаблонами, и у меня возникают проблемы с каким-то запутанным поведением. Я разделил его на минимальный рабочий пример, но по сути я хочу отслеживать, сколько рекурсивных вызовов я делаю. Я хочу сделать это, сделав первый параметр шаблона целым числом, в то время как второй параметр шаблона является вариационным списком. В простейшей форме это выглядит так:
template<typename... List>
struct initial_call{
static const int val = next_call<0, List...>::val;
};
template<int D, typename... List>
struct next_call {
static const int val = D;
};
Поэтому, игнорируя тот факт, что этот код бессмыслен, он не компилируется на VS2013, требуя "неожиданный тип" Список ", в строке внутри определения initial_call. Без целого впереди, он отлично работает. Итак, есть ли способ комбинировать вариативные шаблоны с целыми параметрами шаблона?
Вы можете захотеть что-то вроде этого (считая количество типов):
#include <iostream>
// More than one type: Increment size and consume.
template<size_t N, typename T, typename... List>
struct calculate_list_size {
static const size_t value = calculate_list_size<N + 1, List...>::value;
};
// Last type: Increment size and terminate.
template<size_t N, typename T>
struct calculate_list_size<N, T> {
static const size_t value = N + 1;
};
// Forward to calculate_list_size.
template<typename... List>
struct list_size {
static const size_t value = calculate_list_size<0, List...>::value;
};
// Empty list
template<>
struct list_size<> {
static const size_t value = 0;
};
int main()
{
std::cout << list_size<char, short, int>::value << '\n';
std::cout << list_size<>::value << '\n';
}
next_call
должен быть доinitial_call