2010-05-05 11 views

Respuesta

12

Uso sizeof...:

template<typename... Args> 
constexpr std::size_t length(Args...) 
{ 
    return sizeof...(Args); 
} 

en cuenta que no debe utilizar unsigned, pero std::size_t (definido en <cstddef>). Además, la función debe ser una expresión constante.


Sin utilizar sizeof...:

namespace detail 
{ 
    template<typename T> 
    constexpr std::size_t length(void) 
    { 
     return 1; // length of 1 element 
    } 

    template<typename T, typename... Args> 
    constexpr std::size_t length(void) 
    { 
     return 1 + length<Args...>(); // length of one element + rest 
    } 
} 

template<typename... Args> 
constexpr std::size_t length(Args...) 
{ 
    return detail::length<Args...>(); // length of all elements 
} 

Nota, todo es completamente probado.

+0

Me preguntaba si podríamos volver a maldecir a través de la función de longitud, reduciendo el tamaño de la plantilla Args en cada iteración y teniendo un caso base definido cuando el número de argumentos se convierte en 1. Seguimos incrementando un contador en cada iteración. Simplemente no puedo poner mis pensamientos en el código ... –

+0

@Eternal: sí, podrías, pero ¿no sería más interesante resolver un problema que volver a implementar un operador? – Potatoswatter

+0

Las plantillas variables no funcionan como LISP ... el caso base debe ser la lista vacía. – Potatoswatter

Cuestiones relacionadas