如何创建一个返回传递的参数名称的函数

时间:2016-02-25 11:05:26

标签: c++ function

我正在寻找一种创建命名服务的方法。基本上我需要一个接受任何东西作为参数的函数,并返回给定参数的名称。这可以是任何东西,类,函数,变量等。

std::string name(T t)
{
  if t is a function 
    return __func__ of t

  if t is a variable 
    return name of variable.
}

有什么建议吗?

4 个答案:

答案 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上也有其他答案。)