C ++中是否存在使用其值打印变量名的非宏方式。这是宏观方式:
#define SHOW(a) std::cout << #a << ": " << (a) << std::endl
PS:我使用Linux而不需要跨平台解决方案
答案 0 :(得分:6)
不,C ++不支持反射,这样做的唯一方法(据我所知)是宏。
答案 1 :(得分:3)
您可以使用动态符号,但它只能在使用-rdynamic标志编译的共享库或可执行文件中使用。它只会识别具有默认动态可见性的全局变量。
#include <dlfcn.h>
#include <iostream>
int NameMe = 42;
const char *GetName(const void *ptr)
{
Dl_info info;
if (dladdr(ptr, &info))
return info.dli_sname;
else
return NULL;
}
template<typename T>
void Dump(const T &t)
{
const char *name = GetName(&t);
if (name)
std::cout << name;
else
std::cout << "<unknown>";
std::cout << ": " << t << std::endl;
}
int main()
{
int NoName = 33;
Dump(NameMe);
Dump(NoName);
return 0;
}
$ g++ dump.cpp -ldl -rdynamic
$ ./a.out
NameMe: 42
<unknown>: 33
答案 2 :(得分:0)
没办法。
没有宏,你必须这样做:
std::cout <<"a : " << a << std::endl;
别无他法。
答案 3 :(得分:0)
如果您可以将所有类派生自共同的祖先,则可以提供实现此功能的虚函数。我没有尝试过这个模板,它可能不起作用 - 一些反馈将不胜感激。
struct Reflector
{
virtual void Show() = 0;
};
template<class a, char name[]>
struct ReflectorImpl : public Reflector
{
virtual void Show()
{
std::cout << name << ": " << *this << std::endl;
}
};
class MyClass: public ReflectorImpl<MyClass, "MyClass">
{
};