代码之家  ›  专栏  ›  技术社区  ›  bjskishore123

在switch语句中使用类类型:它是否比使用typeid运算符更好?

c++
  •  4
  • bjskishore123  · 技术社区  · 15 年前

    我在下面看到了关于C++语句中的转换语句$64.2。

    switch语句不能接受条件。

    条件应为整型、枚举型,或为单个转换函数的类类型。 存在整数或枚举类型(12.3)。如果条件是类类型的,则通过调用 转换函数,转换结果将用于替换此函数的其余部分的原始条件。 部分

    我试过下面的代码,它工作正常。

    class Test
    {
    public:
        operator int() { return 1; }
    };
    
    int main()
    {
         Test obj;
         switch(obj)
         {
            case 1: cout<<"Test class object";
            break;
         }
    }
    

    与使用typeid运算符查找对象类型相比,这是更好的方法吗?

    在switch的情况下,开销是每个类都应该有一个唯一的整数id,该id将由转换函数返回。

    在typeid方法中,如果我们使用like typeid(obj)==typeid(test),那么当我们有许多类类型时,if else链将会很长。代码可读性降低。可能比switch case慢,因为switch case可以由编译器像跳转表一样实现。

    那么,在运行时哪种方法更好地找到对象类型呢?

    编辑:考虑到安德烈的评论,修正了问题。

    1 回复  |  直到 12 年前
        1
  •  7
  •   AnT stands with Russia    12 年前

    你从哪里得到“必须执行字符串比较”的想法?为了确定两个 type_info 对象指定相同的类型,您需要比较这些类型 类型信息 直接对象,如 typeid(obj) == typeid(Test) .

    事实上,你 不能 通过比较 type_info::name() 成员是因为语言根本无法保证这些字符串。更具体地说,它不保证每个给定类型的这些字符串的唯一性。他们都能回来 "Hello World!" 适用于所有类型。或者,它们可以为所有类型返回空字符串。通常,实现的行为比这更好,但在任何情况下, name() 成员的存在是为了某些潜在的调试/信息目的。你不能有意义地依赖 键入_info::name()。 在代码的实际功能中。

    而且,语言标准规定 类型信息 对象是具有静态存储持续时间的左值对象。我希望这些 类型信息 对象来维护每个特定类型的“地址标识”(尽管我不确定标准是否真正保证)。也就是说,我希望 &typeid(type) == &typeid(type) 总是正确的(即每次调用 typeid 对于同一类型,得到的左值与结果相同)。如果是这样,您可以比较 地址 属于 类型信息 对象,而不是使用 == 操作员。您还可以使用地址为类型匹配构建一些更复杂的数据结构,例如关联数组。你不能用 switch/case 尽管如此。(再次,我不确定我对稳定地址身份的假设 类型信息 是有效的。其实不是。正如Johannes Schaub在评论中指出的,正确的表达方式 类型信息 s装入订好的容器中,使用 type_info::before() 建立秩序。

    当然,在特定的情况下,为类使用手动实现的整数标识符(如果您真的需要这样做的话)可能会更有效率。它还允许您更灵活地更好地实现您的意图。例如, typeid(Test) == typeid(const Test) 将评估为 false 可能不是你想要的。但是,将转换运算符高度提升为 int 为此目的绝对不是个好主意。如果您确实需要它,请将其设为命名方法并返回名为的内容,而不是“魔力常量”。