2010-08-02 21 views
18

Me gustaría enviar algunos datos a un archivo. Por ejemplo suponer que tengo dos vectores de dobles:convirtiendo un nombre de variable en una cadena en C++

vector<double> data1(10); 
vector<double> data2(10); 

hay una manera fácil de salida a un archivo de modo que la primera fila contiene los encabezados 'datos1' y 'data2' seguido por el contenido real. La función que produce los datos se pasará varias matrices diferentes por lo que no es posible codificar el nombre del encabezado - idealmente me gustaría convertir el nombre de la variable en una cadena y luego emitir esa cadena seguida por el contenido de la matriz de vectores. Sin embargo, no estoy seguro de cómo convertir el nombre de la variable 'datos1' en una cadena, o incluso si se puede hacer fácilmente (a partir de la lectura de los foros de mi conjetura es que no se puede) Si esto no es posible una alternativa podría ser el uso de un contenedor asociativo como un mapa o quizás más simplemente un contenedor 'par'.

pair<vector<double>,string> data1(10,'data1'); 

¡Cualquier sugerencia sería bienvenida!

+0

Me pregunto lo que está tratando de lograr. Si se trata de cantidades arbitrarias de datos, nombrar cada parte de la misma no te servirá de nada, porque de todos modos tiene que hacerse a mano. Su segunda solución es probablemente la que está buscando. – data

+0

relacionado http://stackoverflow.com/questions/201593/is-there-a-simple-way-to-convert-c-enum-to-string –

Respuesta

30

Puede utilizar el preprocesador "stringify" # a hacer lo que quiera:

#include <stdio.h> 

#define PRINTER(name) printer(#name, (name)) 

void printer(char *name, int value) { 
    printf("name: %s\tvalue: %d\n", name, value); 
} 

int main (int argc, char* argv[]) { 
    int foo = 0; 
    int bar = 1; 

    PRINTER(foo); 
    PRINTER(bar); 

    return 0; 
} 


name: foo value: 0 
name: bar value: 1 

(Lo siento por printf, nunca consiguiera la caída de <iostream> Pero esto debería ser suficiente..)

+2

esto podría ayudar -> http://gcc.gnu.org/onlinedocs/cpp/Stringification.html – KedarX

2

Puede utilizar el preprocesador, hay un token de stringify, pero solo está disponible desde la fuente, no a una función (obtendría el nombre del argumento).

1

habría pensado que la respuesta obvia es hacer que la función que realiza la salida toma el texto del título como un parámetro de cadena.

+0

Idealmente me gustaría poder llamar a la función que lo hace la salida sin un parámetro de cadena que contiene los nombres de los varialbes . – Wawel100

+0

@ Wawel100: Imposible. – Puppy

-3

Wow, esto es un poco trickey, una cosa que podrías intentar hacer es hacer clases o estructuras, que tienen un elemento que es la cadena 'name'.

1

adaptado ligeramente de respuesta de @ sarnold, para C++:

#define DEBUG(x) std::cout << #x << " = " << x << std::endl; 

un programa de ejemplo que utiliza esta:

int main() { 
    int foo = 1; 
    DEBUG(foo); 

    return 0; 
} 
0

I tenían el mismo problema. Después de un poco de experimentación, creé las siguientes macros que convierten los nombres de variables, campos, funciones, métodos y tipos en cadenas.

#define MACRO_VARIABLE_TO_STRING(Variable) (void(Variable),#Variable) 

#define MACRO_FUNCTION_TO_STRING(Function) (void(&Function),#Function) 

#define MACRO_METHOD_TO_STRING(ClassName,Method) (void(&ClassName::Method),#Method) 

#define MACRO_TYPE_TO_STRING(Type) (void(sizeof(Type)),#Type) 

el código utiliza el operador de coma y la conversión vacío para forzar compilador para comprobar si la variable, función, etc. realmente existe. Lo bueno es que también funciona bien con variables no inicializadas. Lo probé tanto en VC como en GCC con todas las opciones pedantes que descubrí sin ningún mensaje de advertencia.

int GetAndPrintValue(const char* VariableName) 
{ 
    std::cout << VariableName << std::endl; 
    return 10; 
} 

int Variable=GetAndPrintValue(MACRO_VARIABLE_TO_STRING(Variable)); 

que utilizan dicho código cuando escribo analizadores que lee datos de flujo de entrada y si la variable analizada está fuera de límites lanza una excepción con el nombre de la variable que falló mis comprobaciones de validez.

4

probar esto:

#define GET_VARIABLE_NAME(Variable) (#Variable) 

// en funciones

int var=0;  
char* var_name= GET_VARIABLE_NAME(var); 
0

En este caso he hecho nameof() macro. Devuelve un nombre std :: string de una variable, tipo o miembro. Funciona como nameof() en C#.

Por ejemplo:

#include "nameof.h" 

std::vector<double> data1(10); 
std::string name = nameof(data1); // "data1" 

struct Foo1 
{ 
    struct Foo2 
    { 
     Foo1* foo1; 
    }; 

    Foo1* foo1; 
    Foo2 foo2; 
}; 

name = nameof(Foo1::foo1->foo2.foo1); // "foo1" 

name = nameof(123); // std::logic_error exception 
Cuestiones relacionadas