【发布时间】:2016-06-11 13:45:23
【问题描述】:
假设我们严格使用 Clang。没有使用其他编译器。另请注意,Clang 支持 CXX ABI。
我们使用的是 C++14。
通常,我们会像这样得到解组的类名:
#include <cxxabi.h>
class GoodClass {
public:
virtual const char *foo() const noexcept;
}
const char *
GoodClass::foo() const noexcept
{
// Naive implementation, not gonna' check any errors and stuff.
int32_t status = 0;
return abi::__cxa_demangle(typeid(*this).name(), 0, 0, &status);
}
当我们需要这个类的公共子类的类名时,这个方法会有所帮助:
class SomeSubclassOfGoodClass : public GoodClass { }
SomeSubclassOfGoodClass object;
std::cout << object.foo(); // prints "SomeSubclassOfGoodClass"
但是,在静态方法中,我们不能使用this,因为没有实例。因此,不可能将对象提供给typeid 指令。
示例方法很好用(具有多态性),但是它需要一个实例来操作。这会涉及到面向对象的问题(比如构造函数)。
遇到这种情况你会怎么做?
感谢您的关注。
【问题讨论】:
-
我认为您缺少“clang”标签。
-
我确实读过这个问题,Leviathalon。对于返回您所寻求的信息的静态函数,除了访问该类型的现有对象(在本地创建或通过其他方式访问)和/或将有关该类型的某些特定假设硬编码到功能。您要求第三个选项,它根本不存在。您希望它存在并没有实现。
-
@Leviathlon:.NET 框架无法从静态类成员返回多态类型信息。我不知道那应该是什么,也不知道为什么你认为这很有用。
-
分头发,嗯?我的措辞是我的意思:没有一种针对 .NET 框架的语言可以从静态类成员中推断出动态类型。考虑到它甚至可以在没有对象的情况下调用,那么动态类型应该是什么?这个问题真的没有意义,对不起。
-
调用
X::foo()时你在说什么对象?
标签: c++ polymorphism clang c++14 static-methods