Вариативные шаблоны с константами

0

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

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. Без целого впереди, он отлично работает. Итак, есть ли способ комбинировать вариативные шаблоны с целыми параметрами шаблона?

  • 0
    Извините @cdhowie, я редактировал.
  • 1
    next_call должен быть до initial_call
Показать ещё 3 комментария
Теги:
templates
visual-studio-2013
variadic-templates

1 ответ

1
Лучший ответ

Вы можете захотеть что-то вроде этого (считая количество типов):

#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';
}
  • 0
    Это прекрасно, спасибо! В итоге я выяснил синтаксическую ошибку, которая меня оттолкнула, но приятно иметь полный пример.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню