studio programacion móviles libros lenguajes interpretados desarrollo desarrollar curso aprende aplicaciones c++ c++14 variadic-templates

c++ - programacion - Generando una secuencia de ceros en tiempo de compilación.



manual de programacion android pdf (3)

A pesar de la indudablemente interesante respuesta de @Columbo , quiero sugerir otra solución viable basada en las constexpr variables de la plantilla:

#include <cstddef> template<std::size_t, std::size_t V> constexpr std::size_t repeat_value = V; template<std::size_t... N_i> class A { template<typename... Args> void bar(Args&&...) { } public: void foo() { // repeat N_i times value 0 bar(repeat_value<N_i, 0>...); } }; int main() { A<0, 1, 2, 3, 4> a; a.foo(); }

Me parece más fácil leer al menos, incluso si es malo en términos de rendimiento en tiempo de compilación.

Puedes generalizarlo fácilmente como sigue:

template<std::size_t, typename T, T V> constexpr T repeat_value = V;

La invocación en el caso específico es esta:

bar(repeat_value<N_i, int, 0>...);

Tengo el siguiente problema:

template< size_t... N_i > class A { public: // ... void foo() { bar( /* 0,...,0 <- sizeof...(N_i) many */); } };

Quiero llamar a una bar funciones y pasar sizeof...(N_i) muchos argumentos que son todos ceros, por ejemplo, bar(0,0,0) en caso de sizeof...(N_i) == 3 . ¿Cómo se puede implementar esto?


También puedes usar plantillas para simular algo similar. Esta es una solución muy básica y solo creará una lista de 0s, pero podría extenderse para generar otras secuencias si se desea.

template <size_t Unused> struct Wrap { static constexpr size_t value = 0; }; template <size_t... N_i> class A { public: void foo() { bar(Wrap<N_i>::value...); } };

Lo que simplemente se expandirá en una lista de ceros del mismo tamaño que los argumentos N_i. Es cierto que la interfaz es un poco diferente.

Para ver un ejemplo completo, que muestra los valores de los elementos que recibe la barra, vea aquí: Ejemplo en vivo


bar(((void)N_i, 0)...);

El operador de coma descartará N_i , obteniendo solo el valor del operando de la derecha ( 0 ). El reparto consiste en evitar una advertencia sobre el descarte de N_i .