我正在寻找一种创建命名服务的方法。基本上我需要一个接受任何东西作为参数的函数,并返回给定参数的名称。这可以是任何东西,类,函数,变量等。
std::string name(T t)
{
if t is a function
return __func__ of t
if t is a variable
return name of variable.
}
有什么建议吗?
答案 0 :(得分:7)
C ++不是正确的语言,它根本没有反射功能,你不能对待“任何东西,类,函数,变量等”。均匀。您不能将类传递给函数,也不能将函数传递给函数,它们不是对象。
答案 1 :(得分:5)
使用MACRO,您可以
#define name(n) #n
字符串化给定的参数。
答案 2 :(得分:2)
在C ++中,函数或变量的名称是无意义的。该名称仅在构建时(编译和链接)已知,后来转换为地址。在运行时,所有名称都已消失,无法知道 - 除非使用特殊构建模式以允许调试程序跟踪原始名称。
接近指向void的函数是什么呢?
std::string address(const void *t) {
std::ostringstream os;
os << "Address is " << t;
return os.str();
}
然后您可以这样使用它:
int i;
std::string s;
s = address(static_cast<const void *>(&i));
...
double d;
s = address(static_cast<const void *>(&d));
...
// if f is declared as int f(double d, std::string s):
s = address(static_cast<const void *>(&f));
答案 3 :(得分:1)
正如已经回答的那样,C ++没有反思。但是如果你在运行时有可用的调试符号,那么不同的操作系统/编译器组合可以提供这些信息 - 如果你付出了足够的努力。
搜索获取C ++堆栈跟踪或回溯的机制。
,例如,这个问题有多个答案,指向对Linux有用的库,对Windows有用:C++ display stack trace on exception(在SO和Web上也有其他答案。)