我有这个抽象的基类,我希望它能够获得从它派生的类的名称,无论可能是什么类。我想向用户隐藏此功能,因为我只是使用它来创建日志文件的名称或其他东西。我听说过typeid
,但我无法编译。我也愿意能够获得对象的名称,而不是类。
#include <typeinfo>
class Base{
public:
virtual void lol() = 0;
std::string getName();
};
std::string Base::getName() {
return typeid(*this); // this doesn't work!
}
class Derived : public Base{
void lol() {};
};
int main(int argc, char **argv) {
Derived d;
std::cout << d.getName() << "\n";
return 0; }
答案 0 :(得分:1)
答案 1 :(得分:1)
您可以利用预处理器并在GCC和Clang中使用__PRETTY_FUNCTION__
或在Visual C ++中使用__FUNCTION__
。
#include <iostream>
#include <string>
class Base {
public:
virtual std::string getName();
};
std::string Base::getName() {
return __PRETTY_FUNCTION__;
}
class Derived : public Base {
public:
std::string getName() override {
return __PRETTY_FUNCTION__;
}
};
int main(int argc, char **argv) {
Derived d;
std::cout << d.getName() << "\n";
return 0;
}
不幸的是,他们返回完整的方法名称,上面的示例输出
virtual std::__cxx11::string Derived::getName()
如果你需要它,你可以在Base
中实现一个帮助函数,它将在最后::
和空格之间提取一个类名。
std::string getName() override {
return extractClassName(__PRETTY_FUNCTION__);
}
答案 2 :(得分:-2)
可能有几种方法可以做到这一点......
我可能会 1)在基类中创建一个抽象属性(或访问器函数),如:2)然后在派生类的构造函数中,指定名称...然后基础可以使用它并查看它...