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
.