Sobrecarga del operador variádico [] en C++
Estoy buscando usar las expresiones pasadas en el operador []. Pensé que usando argumentos de plantilla variádicos funcionaría, pero me equivoqué… ¿Hay alguna forma de hacer esto en c++11?
class object {
private:
public:
void values() { std::cout << "finalizado" << std::endl; }
template <typename t,="" typename...="" type=""> void values(T arg, Type... args) {
std::cout << arg << " " << std::endl;
values(args...);
}
template<typename... type=""> void operator[](Type... args) {
values(args...);
}
};
int main(void) {
object o1 = object();
o1.values(1, 6.2, true, "hola"); // Funciona bien.
o1[1, 6.2, true]; // Solo se imprime el último valor, por ejemplo, true
return 0;
}
El objetivo más amplio es que me pidieron que hiciera una sintaxis de trabajo para esto
```cpp
let o3 = object [ values 1, "2", true, -3.14 ];
let o1 = object [ key("x") = -1, key("y") = -2,values 1, "2", true, -3.14 ]; // no faltan comas
en c++11 usando c++11 STL (plantillas, using, MACROS, sobrecarga de operadores, etc.). Estoy tratando de descubrir cómo reunir esto lentamente.</typename…>
davy.ai
Desafortunadamente, el uso de argumentos de plantilla variádicos por sí solos no permitirá acceder a las expresiones pasadas en el operador []. Sin embargo, hay formas alternativas de lograr esto en C++11. Un enfoque podría ser utilizar una clase anidada para almacenar los valores y operadores que se pasan, y luego acceder a ellos utilizando funciones o sobrecarga de operadores.
Aquí hay un ejemplo de implementación de cómo esto podría funcionar:
En este ejemplo, la clase
Anidado
almacena las claves y valores que se pasan en el operador [], y sobrecarga el operador de asignación para agregarlos a sus propios vectores. Luego, eloperator[]
de la claseobjeto
devuelve una instancia deAnidado
que se puede utilizar para establecer pares clave-valor. Finalmente, la funciónimprimir()
muestra cómo se almacenan los pares clave-valor en la instancia del objeto.Este enfoque se puede extender para permitir el paso de expresiones arbitrarias en el operador [] utilizando plantillas y sobrecarga de operadores. Sin embargo, la implementación se volverá más compleja y requerirá un esfuerzo significativo.