c++ - 在 C++ 中获取类名有哪些好的技巧?

标签 c++ types polymorphism typing classname

我不是在谈论 typeid,我只是在寻找将单个对象(例如我的情况下的 std::string )绑定(bind)到某个类的对象并使其 getter 多态或其他东西的通用方法。我真的不能给出一个正确的定义,所以我认为这就像获取类名的问题,但是你自己在某个地方设置它,唯一的问题是你在哪里设置它以及你如何返回它。

我只是想举几个例子,它们可以做我想做的事,但实际上并没有我希望的那样高效。

  • virtual string GetClassName() const { return string("MyClass"); - 每次调用时都会花费额外的时间来构建和复制字符串
  • const string& GetClassName() const { return class_name_; } 其中 class_name_ 是在构造函数中设置的 protected 类字段 - 每个对象中都存储相同的字符串,因此内存效率不高

我正在考虑类似返回对静态对象的 const 引用之类的方法,但我真的找不到使它成为多态的方法。

有什么想法吗?

最佳答案

您无需重新发明轮子,只需使用合适的轮胎即可。

C++ 标准给你 typeid()这适用于所有情况,包括内置类型、自定义类、多态类、多重继承、虚拟继承等等。

现在您可能不喜欢 typeid() 使用的名称,它们是特定于实现的。或者您可能希望使用您自己的类型管理扩展来扩展可用信息。针对这种情况,Bjarne Stroustrup 在《C++ 的设计与演化》中提出了一个非常简单有效的解决方案。

typeid() 返回对const std::type_info 的引用。现在您可以在 unordered_map 中使用此对象的地址, 将类型映射到您自己的自定义信息,可以提供您想要的名称。

此解决方案的优点:使用强大的内置功能,基于每个类的单个附加对象(可以是静态的),获取名称的开销非常低。您需要做的就是考虑如何最好地填充 map 。

这里是一个小而快速的概念证明(当然必须改进):

// Basic principle of the idea
map<const type_info*, string> mytypes;  

template <class T>
const string& mytype(T &&x) {
    return mytypes[&typeid(x)];
}

// Some test types 
struct A { virtual int test() {} };
struct B : A {}; 

int main() {
    // To be improved:  initialization of the type info extension 
    mytypes[&typeid(int)]="Plain C++ integer";
    mytypes[&typeid(A)]="Structure A";
    mytypes[&typeid(B)]="Structure B";

    // demo, including polymorphic type     
    int a; 
    A * p = new B;
    cout << typeid(int).name() <<endl; 
    cout << mytype(a) <<endl; 
    cout << mytype(*p) <<endl; 
    return 0;
}

Online demo

关于c++ - 在 C++ 中获取类名有哪些好的技巧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54800499/

相关文章:

SQL 基本类型 : integer vs int?

types - 如何在Clojure中构建健壮的数据API?

c++ - 简单的 Makefile 问题(具有简单的依赖性)

c++ - C++ 规范是否允许非虚拟类的实例包含用于 vtable 指针的内存?

c++ - 生成使用颜色检查器生成的imatest颜色误差图的背景?

C++文件输出只接受第一个字

c# - JSON.NET 反序列化为带有 Type 参数的对象

haskell - 类型级别的类型类可以用更高级别的类型来模拟吗?

c# - C#是否可以将基类的实例用于子类的不同实例?

javascript - 如何缓解无类型语言中返回类型多态性的缺乏?