2010-08-02 15 views
18

Chciałbym wyprowadzić niektóre dane do pliku. Na przykład założyć, mam dwa wektory podwójnej:konwertowanie nazwy zmiennej na ciąg znaków w C++

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

Czy istnieje prosty sposób na wyjście to do pliku tak, że pierwszy wiersz zawiera nagłówki „data1” oraz „” dane2 następnie rzeczywistej zawartości. Funkcja, która wypisze dane, zostanie przekazana do różnych różnych tablic, więc nie będzie możliwe wpisanie na stałe nazwy nagłówka - najlepiej, jeśli zmienię nazwę zmiennej na jakiś łańcuch, a następnie wypiszę ten ciąg, a następnie zawartość tablica wektorowa. Nie jestem jednak pewien, jak przekonwertować nazwę zmiennej "data1" na ciąg znaków, , a nawet, jeśli można to łatwo zrobić (czytając forum, przypuszczam, że nie może tego zrobić) Jeśli nie jest to możliwe, alternatywa może być użycie pojemnika asocjacyjnego, takiego jak mapa lub może po prostu kontener "pary".

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

Wszelkie sugestie byłyby mile widziane!

+0

muszę się zastanawiać, co staramy się osiągnąć. Jeśli jest to dowolna ilość danych, nazwanie każdej jej części nie przyniesie Ci nic dobrego, ponieważ i tak trzeba to zrobić ręcznie. Twoje drugie rozwiązanie to prawdopodobnie to, czego szukasz. – data

+0

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

Odpowiedz

30

Można użyć preprocesor "stringify" # robić to, co chcesz:

#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 

(Przepraszam za printf, nigdy nie dostałem zawiesić <iostream> Ale to powinno wystarczyć.).

+2

może to pomóc -> http://gcc.gnu.org/onlinedocs/cpp/Stringification.html – KedarX

2

Możesz użyć preprocesora, jest tofikat sznurka, ale jest dostępny tylko ze źródła, a nie z funkcji (otrzymasz nazwę argumentu).

1

Wydaje mi się, że oczywistą odpowiedzią jest, aby funkcja, która wykonuje wynik, przyjęła tekst nagłówka jako parametr łańcuchowy.

+0

Idealnie chciałbym móc wywołać funkcję, która ma dane wyjściowe bez parametru ciągu zawierającego nazwy zmiennych wariancji . – Wawel100

+0

@ Wawel100: Impossible. – Puppy

-3

Wow, to trochę sztuczka, jedną rzeczą, którą możesz spróbować zrobić, to zrobić klasy lub struktury, które mają element będący ciągiem "nazwa".

1

nieznacznie dostosowane od użytkownika @ sarnold odpowiedź, C++:

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

Przykładowy program, który korzysta z tego:

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

    return 0; 
} 
0

miałem ten sam problem. Po odrobinie eksperymentów stworzyłem następujące makra, które zamieniają nazwy zmiennych, pól, funkcji, metod i typów na łańcuchy.

#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) 

Kod używa operatora przecinka i nieważnej konwersji, aby wymusić na kompilatorze sprawdzenie, czy rzeczywiście istnieje zmienna, funkcja itp. To dobrze, że działa również z niezainicjowanymi zmiennymi. Przetestowałem to na VC i GCC z wszystkimi opcjami pedantycznymi, które odkryłem bez żadnych komunikatów ostrzegawczych.

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

int Variable=GetAndPrintValue(MACRO_VARIABLE_TO_STRING(Variable)); 

mogę użyć takiego kodu, gdy piszę parser, który odczytuje dane ze strumienia wejściowego i jeśli zmienna analizowany jest poza zakresem zgłasza wyjątek z nazwą zmiennej że nie sprawdza moje ważności.

4

spróbować tego:

#define GET_VARIABLE_NAME(Variable) (#Variable) 

// funkcje

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

w tym przypadku mam wykonane nameof() makro. Zwraca std :: string nazwy zmiennej, typu lub członka. Działa jak nazwaof() w języku C#.

Dla przykładu:

#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 
Powiązane problemy