在switch语句中使用类类型:是否比使用typeid运算符更好? 我在C++标准下看到了关于交换语句的内容$64.2../P>

在switch语句中使用类类型:是否比使用typeid运算符更好? 我在C++标准下看到了关于交换语句的内容$64.2../P>,c++,C++,Switch语句可以接受一个条件 该条件应为整型、枚举型或类类型,其中单个转换函数用于 存在整数或枚举类型(12.3)。如果条件为类类型,则通过调用 转换函数,并使用转换结果来代替此函数其余部分的原始条件 部分 我尝试了下面的代码,这是工作良好 class Test { public: operator int() { return 1; } }; int main() { Test obj; switch(obj) { case 1: c

Switch语句可以接受一个条件

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

我尝试了下面的代码,这是工作良好

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

int main()
{
     Test obj;
     switch(obj)
     {
        case 1: cout<<"Test class object";
        break;
     }
}
类测试
{
公众:
运算符int(){return 1;}
};
int main()
{
测试对象;
开关(obj)
{

案例1:cout您从哪里得到“必须执行字符串比较”的想法?为了确定两个
type\u info
对象是否指定了相同的类型,您需要直接比较这些
type\u info
对象,如
typeid(obj)==typeid(Test)

事实上,通过比较
type_info::name()
成员返回的字符串,您不能做同样的事情,因为该语言根本不保证这些字符串。更具体地说,它不保证每个给定类型的这些字符串的唯一性。它们都可以返回
“Hello World!”
用于所有类型。或者,它们可以为所有类型返回空字符串。通常,实现的行为比这更好,但在任何情况下,
name()
成员都存在,用于一些潜在的调试/信息目的。在代码的实际功能中,您不能有意义地依赖
type\u info::name()

此外,语言标准规定,
type\u info
对象是具有静态存储持续时间的左值对象。我希望这些
type\u info
对象能够为每个特定类型维护其“地址标识”(尽管我不确定标准是否确实保证了这一点)。也就是说,我希望
&typeid(type)=&typeid(type)
始终为真(即,每次为同一类型调用
typeid
,都会得到与结果相同的左值)。如果是这样,您可以比较
type_info
对象的地址,而不是使用
=
运算符进行比较。您还可以使用这些地址为类型匹配构建一些更复杂的数据结构,如关联数组。但不能对其使用
开关/case
。(再说一次,我不确定我关于
type\u info
的稳定地址标识的假设是否有效)。事实并非如此。正如Johannes Schaub在评论中指出的那样,将
type\u info
s放入有序容器的正确方法是使用
type\u info::before()
建立有序


当然,在您的特定情况下,为类使用手动实现的整数标识符(如果您真的需要这样做)可能会更有效率。它还允许您更灵活地更好地实现您的意图。例如,
typeid(Test)==typeid(const Test)
将计算为
false
,这可能不是您想要的。但是,为此目的将转换运算符劫持为
int
这样的基本类型绝对不是一个好主意。如果确实需要它,请将其设为命名方法并返回命名的内容,而不是“魔法常量”是的,我错过了。但是如果我们使用like-typeid(obj)=typeid(Test),if-else当我们有许多类类型时,链会很长。代码可读性会降低。与switch case相比,它的速度也可能较慢,因为编译器可以像跳转表一样实现switch case。请注意,type\u info之前有一个成员函数,可以用来确定顺序,将其放入ass关联容器。据我所知,标准保证由
typeid(…)
指定的对象在程序终止之前一直存在,但不保证
&typeid(x)=&typeid(x)
。我听说允许这样做是因为动态库在其对象文件中分配了各自的
类型信息“您是从哪里想到“必须执行字符串比较的”?“这就是windows动态_cast实现的工作原理;另请参见顶级cv限定符被
typeid
忽略,因此
typeid(Test)==typeid(const Test)
将计算为
true
。注意
操作符int()
在您的示例中,必须是
虚拟的
才能在您不知道确切类型时正常工作(否则您就不需要这种疯狂的破解)@KennyTM:我知道这个问题有点疯狂。我正试图在家里更好地学习使用语言功能,这就是为什么我将其标记为家庭作业。希望你能理解。@slacker:是的,你是对的。实际上我是在试验类的层次结构时添加的。@bjskishore123:一般来说,如果你需要对象的动态类型,请更改t他编写代码,这样一开始就不会忘记。使用开关是个糟糕的主意。