Хороший вопрос, подумал, что я бы бросил свою шляпу в кольцо ... Я думаю, вы можете передавать указатели на статические переменные в качестве аргументов шаблонного типа.С C ++ 20 похоже, что это не будет проблемой ... А пока вот несколько дешевых макросов, чтобы заставить его работать.
template <const char *Name, typename T>
struct TaggedValue {
static constexpr char const *name{Name};
T value;
friend ostream &operator<<(ostream &o, const TaggedValue &a) {
return o << a.name << " = " << a.value;
}
};
#define ST(name, type)\
const char ST_name_##name[]{#name};\
using name = TaggedValue<ST_name_##name,type>;
ST(Foo, int);
ST(Bar, int);
ST(Bax, string);
int main() {
cout << Foo{3} << endl;
cout << Bar{5} << endl;
cout << Bax{"somthing"} << endl;
}