2011-06-05 15 views
9

Actualmente tengo una función variadica que toma un número arbitrario de argumentos de tipos arbitrarios (duh), sin embargo, quiero restringir los tipos a los que son solo POD, y también del mismo tamaño o más pequeños que el de un vacío *.Plantillas variables y rasgos de tipo

El vacío * El registro fue fácil, acabo de hacer esto:

static_assert(sizeof...(Args) <= sizeof(PVOID), "Size of types must be <= memsize."); 

sin embargo no puedo encontrar la manera de hacer lo mismo para std :: is_pod.

¿Es esto posible?

+2

'sizeof (... args)' probablemente no hace lo que se propone - Devuelve cuántos argumentos hay en el paquete de argumentos (y no en sus tamaños). Ver [esto] (http://ideone.com/X8X3p). Si desea limitar su tamaño, hacer algo como 'static const bool value = sizeof (Head) <= sizeof (void *) && ...' ayudaría, vea [this] (http://ideone.com/PUMXx) – Vitus

Respuesta

11

puede escribir una función de meta-para determinar si todos son tipos de POD:

template <typename... Ts> 
struct all_pod; 

template <typename Head, typename... Tail> 
struct all_pod<Head, Tail...> 
{ 
    static const bool value = std::is_pod<Head>::value && all_pod<Tail...>::value; 
}; 

template <typename T> 
struct all_pod<T> 
{ 
    static const bool value = std::is_pod<T>::value; 
}; 

continuación

static_assert(all_pod<Args...>::value, "All types must be POD"); 
+0

Bajo GCC 4.6 esto me da el siguiente error (recortado para dar las partes relevantes): "tipo/valor no coinciden en el argumento 1 en la lista de parámetros de plantilla" "espera un tipo, tiene 'Args ...'" – RaptorFactor

+0

No importa, Soy un idiota Estaba pasando los valores no los tipos. Duh. – RaptorFactor

+0

No funciona cuando 'Args ...' está vacío. Mejor uso: '' 'template <> struct all_pod <> { static const bool value = true; }; '' 'en lugar de' '' plantilla struct all_pod { valor const bool estático = std :: is_pod :: valor; }; '' ' –