2010-05-26 13 views
8

Si el título no estaba claro, voy a tratar de aclarar lo que estoy preguntando:Acceso valor de la variable usando cadena que representa el nombre de variable en C++

Imagínese que tiene una variable llamada contador, sé que puedo ver su valor actual haciendo algo como:

std::cout << counter << std::endl; 

sin embargo, supongamos que tengo un montón de variables, y no sé lo que voy a querer mirar hasta el tiempo de ejecución.

¿Alguien sabe alguna manera de buscar el valor de una variable mediante el uso de su nombre, por ejemplo:

std::cout << valueOf("counter") << std::endl; 

Siento ser capaz de hacer esto podría hacer que la depuración de proyectos grandes y complejos más fácil.

Gracias de antemano por su tiempo.


Actualizar: Todas las respuestas proporcionadas son válidas y útiles, sin embargo, el punto principal es que la reflexión no existe en C++ (y después de leer el enlace recomendado es claro por qué).

+0

¿Es esa cadena 'counter' conocida en * compile-time *? – kennytm

+6

se llama "depurador" - le permite examinar valores de variables durante el tiempo de ejecución, entre otras funciones útiles :) – Drakosha

+0

Estoy al tanto de los depuradores y la depuración, las otras respuestas identificaron que estaba preguntando sobre la reflexión, un término que desconocía previamente de ... –

Respuesta

10

Como se ha mencionado, usted está buscando la reflexión en C++. No tiene eso, y this answer explica por qué.

0

Esto necesitaría algo parecido a la reflexión o evaluación que C++ no tiene.

0

No, C++ no proporciona esa facilidad. Es posible que pueda hackear algo junto con macros (u otro truco) pero es probable que sea bastante feo.

Como no puedo pensar en ninguna buena razón por la que esto podría ser útil, tal vez podrías aclararnos. Cuando algo no se puede hacer de cierta manera, a menudo es bueno retroceder a los requisitos básicos y ver si hay otra manera.

+0

Esto es extremadamente útil al depurar Algoritmos Genéricos. Cuando algo falla en un algoritmo genérico, ver el nombre del tipo real realmente ayuda. Muchas veces, los depuradores no muestran esto. –

4

Puede utilizar un contenedor asociativo como std :: map < std :: string, your_variable_type> para vincular una cadena a una variable, suponiendo que todos son del mismo tipo.

Si tiene variables de diferentes tipos, existe una solución, como en el impulso :: variante

1

C++ se dirige a todas las variables a través de la dirección de modo que no hay forma de decir simplemente valueOf una variable (Idiomas que permiten este ejemplo pitón, perl tiene un tiempo de ejecución que mantiene esta información)

Puede implementar algo que permita el uso de un nombre para encontrar un valor al almacenar los valores y sus nombres en un std :: map.

1

Bueno, si realmente quieres hacer algo como esto, puedes intentar usar std :: map (map < string, int *>). Hovewer esto te restringiría a un tipo de variable, a menos que profundices en alguna feal magia de puntero. De cualquier forma, será feo y confía en mí, realmente no quieres seguir este camino. ¿Por qué necesitas esa característica? Si para depuración, use un depurador.

3

No, no con C++ o su biblioteca estándar. Por supuesto, puedes hackear algo para emular este comportamiento. C++ le permite elegir métodos en tiempo de ejecución, usando polimorfismo, para que pueda aprovechar eso.En esencia, se obtendrá la método para invocar en tiempo de ejecución, en lugar de la variable y el método devolverá el vlaue:

struct Value { 
    virtual ~Value(); 
    virtual std::string value() const = 0; 
}; 

struct Counter : public Value { 
    int v; 
    std::string value() const { 
     istringstream ss(v); 
     return ss.str(); 
    } 
}; 

struct Mounter : public Value { 
    double v; 
    std::string value() const { 
     istringstream ss(v); 
     return ss.str(); 
    } 
}; 

Value* get_value(); 

// ... 
cout << get_value()->value() << endl; 

Alternativamente, puede mantener un mapa introducido en las cadenas, los nombres de los valores, y luego buscar los valores con sus nombres.

1

Como ya se dijo, C++ no proporciona ninguna reflexión. Pero puede usar alguna asignación de clave/valor por su cuenta. Cuando solo se necesita un tipo de valor (por ejemplo, int), puede utilizar un contenedor asociativo STL (mapa) fuera de la caja. Si necesita admitir varios tipos de valores, recomiendo echar un vistazo a la biblioteca Variant.

Cuestiones relacionadas