2017-02-14 24 views
0

变量名有什么办法,用C++ 11,得到一个变量,它是一个(可能是静态)constexpr的名称。C++ 11打印运行时间等于一些constexpr变量

例如:

struct Foo{ 
    int x, y, z; 
}; 

constexpr Foo PrintMe = { 1, 2, 3}; 

我想获得一个字符串 “PrintMe” 不知何故。

我知道,我可以用这样的宏:

#define NAME_OF(v) #v 

,并呼吁

std::cout << NAME_OF(PrintMe) << std::endl; 

,它将打印

PrintMe

是否有办法到g et以下打印相同?

Foo a = PrintMe; 

std::cout << Magic(a) << std::endl; 

编辑: 我不是在寻找一些神奇的解决方案,这将使呼叫Magic(a)工作。我明白,做一些事情来适应我想要的需要定义一些宏或模板。 像枚举可以以某种方式进行打印(How to convert an enum type variable to a string?

+4

你在找什么叫反射,它不是C++的一部分。 – NathanOliver

+0

编号顺便说一句,它与'constexpr'有什么关系。这在C++中是不可能的,无论它是否是“constexpr”。 – Nawaz

+0

此外,您的标题是误导。你有办法打印编译时间变量,你正在寻找打印运行时变量。 – NathanOliver

回答

2

如果你想做到这一点没有宏,没有办法,不,你必须做某种元类,以实现这一目标。

+0

我从哪里开始的某种元类 – ZivS

+0

C++中的“元类”究竟是什么? –

+0

目前还不存在,请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0194r3.html获取提案。在那之前,你需要一些语言之外的东西来处理你的源代码以产生额外的信息(比如Qt的'moc') –

0

Foo a = PrintMe;值语义,其分配的PrintMea值之后,就没有检查这个值是否从PrintMe传来的方式当然,你可以检查相同的值:。

std::string Magic(const Foo& a) { 
    if (a == PrintMe) { return NAME_OF(PrintMe); }; 
    else { /* whatever you want to happen here */ } 
} 

但是这当然也返回"PrintMe"如果你没有

Foo a = {1, 2, 3}; 

因为价值是一样的PrintMe