Una forma muy extraña de escribir matrices
template<typename t="">
void print(T &t) {
cout << t << " ";
}
template<typename ...ts="">
void gogo(Ts&& ...agvs) {
int arr[] = { (print(agvs),0)... };
cout << "\n";
for (auto vi:arr)
cout << vi << " ";
}
template<typename ...ts="">
void go(Ts&& ...agv) {
gogo(forward<ts>(agv)...);
}
A continuación se presentan las llamadas reales
ver descripción de la imagen aquí
ver descripción de la imagen aquí
No entiendo esto (print(agvs),0)...
¿Por qué funciona de esta manera?
davy.ai
El código en la pregunta utiliza una característica de C++ llamada expresiones plegables (fold expressions). Específicamente, el código
(print(agvs),0)...
utiliza una expresión plegable con el operador coma para crear un array de enteros.Desglosemos esto:
(print(agvs),0)
, se llama a la funciónprint
en cada argumento enagvs
, pero el resultado de esa llamada se descarta y se reemplaza por0
.(print(agvs),0)...
es una expresión plegable, donde...
significa que la expresión se debe aplicar a todos los elementos en el conjunto de parámetrosagvs
. Por lo tanto, en este caso,(print(agvs),0)...
se expande a(print(agvs_1),0), (print(agvs_2),0), ...
para todos los argumentos enagvs
.arr
. Dado que el tipo de(print(agvs),0)
esint
, el array resultante tiene un tamaño igual al número de argumentos enagvs
y contiene todos0
s.En resumen, este código utiliza una expresión plegable con el operador coma para llamar a la función
print
en cada argumento de un conjunto de parámetros, al mismo tiempo que construye un array de enteros del mismo tamaño. El array resultante se imprime en la consola.