#include <iostream>
#include <regex>
template <typename T, T& var>
std::string get_variable_name() {
std::string str(__PRETTY_FUNCTION__);
std::smatch match;
std::regex pattern("T& var = ([^;]+)");
std::regex_search(str, match, pattern);
return match[1];
}
int main()
{
extern char char_1;
extern int int_2;
extern double double_3;
extern float float_4;
extern std::string string_5;
std::cout << get_variable_name<decltype(char_1), char_1>() << std::endl;
std::cout << get_variable_name<decltype(int_2), int_2>() << std::endl;
std::cout << get_variable_name<decltype(double_3), double_3>() << std::endl;
std::cout << get_variable_name<decltype(float_4), float_4>() << std::endl;
std::cout << get_variable_name<decltype(string_5), string_5>() << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cmVnZXg+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgVCYgdmFyPgpzdGQ6OnN0cmluZyBnZXRfdmFyaWFibGVfbmFtZSgpIHsKICBzdGQ6OnN0cmluZyBzdHIoX19QUkVUVFlfRlVOQ1RJT05fXyk7CiAgc3RkOjpzbWF0Y2ggbWF0Y2g7CiAgc3RkOjpyZWdleCBwYXR0ZXJuKCJUJiB2YXIgPSAoW147XSspIik7CiAgc3RkOjpyZWdleF9zZWFyY2goc3RyLCBtYXRjaCwgcGF0dGVybik7CiAgcmV0dXJuIG1hdGNoWzFdOwp9CgppbnQgbWFpbigpCnsKICAgZXh0ZXJuIGNoYXIgY2hhcl8xOwogICBleHRlcm4gaW50IGludF8yOwogICBleHRlcm4gZG91YmxlIGRvdWJsZV8zOwogICBleHRlcm4gZmxvYXQgZmxvYXRfNDsKICAgZXh0ZXJuIHN0ZDo6c3RyaW5nIHN0cmluZ181OwoKICAgc3RkOjpjb3V0IDw8IGdldF92YXJpYWJsZV9uYW1lPGRlY2x0eXBlKGNoYXJfMSksIGNoYXJfMT4oKSA8PCBzdGQ6OmVuZGw7CiAgIHN0ZDo6Y291dCA8PCBnZXRfdmFyaWFibGVfbmFtZTxkZWNsdHlwZShpbnRfMiksIGludF8yPigpIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8IGdldF92YXJpYWJsZV9uYW1lPGRlY2x0eXBlKGRvdWJsZV8zKSwgZG91YmxlXzM+KCkgPDwgc3RkOjplbmRsOwogICBzdGQ6OmNvdXQgPDwgZ2V0X3ZhcmlhYmxlX25hbWU8ZGVjbHR5cGUoZmxvYXRfNCksIGZsb2F0XzQ+KCkgPDwgc3RkOjplbmRsOwogICBzdGQ6OmNvdXQgPDwgZ2V0X3ZhcmlhYmxlX25hbWU8ZGVjbHR5cGUoc3RyaW5nXzUpLCBzdHJpbmdfNT4oKSA8PCBzdGQ6OmVuZGw7Cn0K