converting a variable name to a string in C++

Viewed 71435

I'd like to output some data to a file. For example assume I have two vectors of doubles:

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

is there an easy way to output this to a file so that the first row contains the headings 'data1' and 'data2' followed by the actual contents. The function which outputs the data will be passed various different arrays so hardcoding the name of the heading is not possible - ideally I'd like to convert the variable name to some string and then output that string followed by the contents of the vector array. However, I'm not sure how to convert the variable name 'data1' to a string, or indeed if it can easily be done (from reading the forums my guess is it can't) If this is not possible an alternative might be to use an associative container such as map or perhaps more simply a 'pair' container.

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

Any suggestions would be welcome!

8 Answers

try this:

#define GET_VARIABLE_NAME(Variable) (#Variable)

//in functions

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

I had a similar quest. In Qt, I got tired of constantly writing the variable name as a string without autocomplete when writing to qDebug(). After a lot of trial and error with different macros and functions, I found that this macro works great:

#define PRINT(x) ", " << #x << ": " << x

Example usage:

int someVariable = 42;
double anotherVariable = 13.37;
qDebug().nospace() << "Some text" << PRINT(someVariable) << PRINT(anotherVariable);

Output:

Some text, someVariable: 42, anotherVariable: 13.37

I guess this (or something very similar) will work for std::cout as well.

A bit late to the party, but I hope this can help anyone out there!

For this case I have made nameof() macro. It returns a std::string name of a variable, type or member. It works like nameof() in C#.

For Example:

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