为什么不允许类型名称?

why type name is not allowed?

我想在传递某个枚举时属性,输出对应的带有类型检查的运算符,这里是一个简单的代码示例

#include <iostream>
#include <typeinfo>
//#include <memory>

enum MessageType : uint16_t
{
    Display,
    Warning,
    Error
};

#define MESSAGE(_MessageType, _Text)\
    if((_MessageType == Display) && (typeid(_MessageType).name() == MessageType))\
    {\
        std::cout<<"Display: "<<_Text;\
    }\
    else if((_MessageType == Warning) && (typeid(_MessageType).name() == MessageType))\
    {\
        std::cout<<"Warning: "<<_Text;\
    }\
    else if ((_MessageType == Warning) && (typeid(_MessageType).name() == MessageType))\
    {\
        std::cout<<"Error: "<<_Text;\
    }\
    else\
        return

int main()
{
    MESSAGE(Display, "Text!"); // type name is not allowed
    return 0;
}

std::type_info::namereturn一个c-string。 MessageType 不是字符串,它是一种类型的名称。您可以将 typeid(_MessageType).name() 中的字符串 return 与 typeid(MessageType).name() 中的字符串 return 进行比较。

但是,以 _ 开头后跟大写字母的标识符将被保留。如果您使用它们,您的代码将具有未定义的行为。此外 main 不是 void 你必须 return 一个 int.

最后但同样重要的是,当您可以使用 constexpr ifstd::is_same 时,您不需要 typeid。当类型不匹配时,一个简单的函数而不是宏也会使编译器更容易出错。目前,您对正确类型的检查是在运行时进行的。我认为没有理由在这里使用宏,没有宏也可以实现同样的效果。