2017-02-14 38 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