【问题标题】:Can we get the object name using “this” pointer我们可以使用“this”指针获取对象名称吗
【发布时间】:2018-05-16 07:42:48
【问题描述】:

我想在运行时以编程方式检索 C++ 类实例的标识符。我知道 C++ 还不支持反射,但是有没有其他的解决方案呢? 例如,给定以下示例:

class Foo {
  Foo() {
   auto name = reflect::getIdentifierName(this);
   std::cout << name << std::endl;
  }
};

void main() {
   Foo my_obj;
}

执行这个程序应该打印出“my_obj”。 我正在寻找任何可以用来实现这个基本反射函数的实用程序库。

我特别想知道是否可以使用 libclang 来提取此类信息 - 如果可以,请提供有关如何构建反射函数来执行此操作的任何提示。

【问题讨论】:

  • 那不是类名,那是对象的标识符。您是否考虑过将名称作为字符串提供给构造函数,将其存储并从 getter 中返回?
  • 对象没有名字,变量有。一般来说,对象和变量之间没有 1:1 的关系。
  • 我正在寻找一种工具,可以帮助以编程方式检索类对象实例的名称(而不是类的名称)。例如任何解析器工具。

标签: c++ gcc reflection introspection libclang


【解决方案1】:

是的,但这是实现定义的。风险自负。

如果没有更多上下文,Yunnosch 的建议听起来更合理。

#include <iostream>
#include <typeinfo>

class Foo {
public:
  Foo() {
   const char * const name = typeid(this).name();
   std::cout << name << std::endl;
  }
};

int main()
{
   Foo my_obj;
}

【讨论】:

  • 感谢您的回答。这个解决方案将输出不是“my_obj”的“Foo”,我正在寻找一种方法来打印出类实例变量,而不是类名。
  • 你说的这个“类实例变量”是什么?我不知道任何自动提供的变量,但您可以通过使用静态变量或仅使用 this 指针来获取每个对象的唯一地址来创建自己的变量。
猜你喜欢
  • 1970-01-01
  • 2021-05-07
  • 2011-06-12
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
相关资源
最近更新 更多