2014-11-17 3 views
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, утверждая, что «неожиданный тип«List», на линии внутри определения initial_call. Без целого впереди, он отлично работает. Итак, есть ли способ комбинировать вариативные шаблоны с целыми параметрами шаблона?

+0

К сожалению @cdhowie, я отредактированный. – rkevingibson

+1

'next_call' должен быть до' initial_call' –

+1

После размещения 'next_call' перед' initial_call' он [работает для меня] (http://ideone.com/PV41Hc). – cdhowie

ответ

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

Это прекрасно, спасибо! Я закончил тем, что выяснил синтаксическую ошибку, которая меня отбрасывала, но неплохо иметь полный пример. – rkevingibson

Смежные вопросы