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

bjs*_*123 4 c++

我在下面看到了关于c ++标准$ 6.4.2中switch语句的事情.

Switch语句可以采取一个条件.

条件应为整数类型,枚举类型或类型,其中存在单个转换函数为积分或枚举类型(12.3).如果条件是类类型,则通过调用该转换函数来转换条件,并使用转换结果代替本节其余部分的原始条件

我尝试下面的代码,工作正常.

class Test
{
public:
    operator int() { return 1; }
};

int main()
{
     Test obj;
     switch(obj)
     {
        case 1: cout<<"Test class object";
        break;
     }
}
Run Code Online (Sandbox Code Playgroud)

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

在switch case方式中,开销是每个类应该有一个唯一的整数id,它将由转换函数返回.

以typeid方式,如果我们使用类似typeid(obj)== typeid(Test),如果我们有很多类类型,if else链将会很长.代码可读性降低.与switch情况相比可能更慢,因为switch case可能像Compiler的跳转表一样实现

那么,哪种方式更适合在运行时找到对象类型?

编辑:考虑安德烈的评论纠正的问题.

AnT*_*AnT 7

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

事实上,你不能通过比较type_info::name()成员返回的字符串来做同样的事情,因为语言根本不保证这些字符串.更具体地说,它不能保证每种给定类型的这些字符串的唯一性.他们都可以返回"Hello World!"所有类型.或者他们可以返回所有类型的空字符串.通常,实现的行为比这更好,但无论如何,name()成员都有一些潜在的调试/信息用途.您不能有意义地依赖type_info::name()代码的实际功能.

此外,语言标准说type_info对象是具有静态存储持续时间的左值对象.我希望这些type_info对象能够为每种特定类型维护它们的"地址标识"(尽管我不确定标准实际上是否保证了这一点).即我希望它&typeid(type) == &typeid(type)总是正确的(即每次调用typeid相同类型时,你得到的结果都是相同的左值).如果是这样,您可以比较对象的地址,type_info而不是使用==运算符进行比较.您还可以使用这些地址为类型匹配构建一些更复杂的数据结构,如关联数组.但你不能使用switch/case它.(而且,我不确定我对稳定地址标识的假设type_info已验证).事实上并非如此.正如Johannes Schaub在评论中指出的那样,将type_infos放入有序容器的正确方法是使用它type_info::before()来建立排序.

当然,在您的特定情况下,使用手动实现的类的整数标识符(如果您真的需要这样做)可能会更有效率.它还允许您更灵活地更好地实现您的意图.例如,typeid(Test) == typeid(const Test)将评估false,可能不是您想要的.然而,将转换操作符高级劫持到这样的基本类型int绝对不是一个好主意.如果你真的需要它,那就把它作为一个命名方法并返回一些命名的东西,而不是一个"魔法常量".