为什么不允许类型名称?
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::name
return一个c-string。 MessageType
不是字符串,它是一种类型的名称。您可以将 typeid(_MessageType).name()
中的字符串 return 与 typeid(MessageType).name()
中的字符串 return 进行比较。
但是,以 _
开头后跟大写字母的标识符将被保留。如果您使用它们,您的代码将具有未定义的行为。此外 main
不是 void
你必须 return 一个 int
.
最后但同样重要的是,当您可以使用 constexpr if
和 std::is_same
时,您不需要 typeid
。当类型不匹配时,一个简单的函数而不是宏也会使编译器更容易出错。目前,您对正确类型的检查是在运行时进行的。我认为没有理由在这里使用宏,没有宏也可以实现同样的效果。
我想在传递某个枚举时属性,输出对应的带有类型检查的运算符,这里是一个简单的代码示例
#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::name
return一个c-string。 MessageType
不是字符串,它是一种类型的名称。您可以将 typeid(_MessageType).name()
中的字符串 return 与 typeid(MessageType).name()
中的字符串 return 进行比较。
但是,以 _
开头后跟大写字母的标识符将被保留。如果您使用它们,您的代码将具有未定义的行为。此外 main
不是 void
你必须 return 一个 int
.
最后但同样重要的是,当您可以使用 constexpr if
和 std::is_same
时,您不需要 typeid
。当类型不匹配时,一个简单的函数而不是宏也会使编译器更容易出错。目前,您对正确类型的检查是在运行时进行的。我认为没有理由在这里使用宏,没有宏也可以实现同样的效果。