2012-04-11 3 views
4

Предположим, у меня есть перечисление, и я хочу, чтобы каждое значение перечисления ассоциировалось с определенным типом. Скажем, стандартный тип double, и если я хочу, чтобы это было чем-то другим, мне нужно явно указать его.Шаблоны типов шаблонов Variadic Разрешение

Q1: Это предпочтительный способ реализовать такую ​​вещь?

enum A { 
    v1, 
    v2, 
    v3 
}; 

// for every value of A, the standard type is double 
template<A a> 
struct A_info { 
    typedef double type; 
}; 

// other types for certain values can be specified using specialization 
template<> 
struct A_info<v2> { 
    typedef size_t type; 
}; 

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

template<typename T> 
void foo() { /* do something */ } 

template<A a> 
void bar() { 
    foo< typename A_info<a>::type >(); 
} 

Это прекрасно работает. Теперь предположим, я другая функция в зависимости от VARIADIC списка шаблонов, и я хочу сделать что-то подобное, как описано выше ...

template<typename ... T> 
void foo_multiple() { /* stuff */ } 

template<A ... a> 
void bar_multiple() { 
    foo_multiple< /* ??? */ >(); 
} 

Q2: Как это реализовать? Это возможно, так или иначе?

+0

Первый пример отсутствует 'typename'. –

+0

Исправлено это. Благодаря! – fdlm

ответ

8

Просто разверните VARIADIC параметра пакет с рисунком вы хотите:

template<A ... a> 
void bar_multiple() { 
    foo_multiple<typename A_info<a>::type...>(); 
} 
+0

Так просто. Спасибо, я приму это как можно скорее. – fdlm