是否可以定义enumalpha? [英] Is it possible to define enumalpha?
本文介绍了是否可以定义enumalpha?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想要写:
cout << enumalpha << Monday;
并在控制台上打印:
星期一
PS星期一是一个枚举类型。
P.S. Monday is an enum type.
推荐答案
好的,让我们去所有的预处理器然后:)
Okay, let's go all preprocessor then :)
预期的使用方式:
DEFINE_ENUM(DayOfWeek, (Monday)(Tuesday)(Wednesday)
(Thursday)(Friday)(Saturday)(Sunday))
int main(int argc, char* argv[])
{
DayOfWeek_t i = DayOfWeek::Monday;
std::cout << i << std::endl; // prints Monday
std::cin >> i >> std::endl; // reads the content of a string and
// deduce the corresponding enum value
}
黑魔法,涉及到有用的 Boost.Preprocessor 库。
Dark magic, involving the helpful Boost.Preprocessor library.
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/stringize.hpp>
#include <boost/preprocessor/seq/enum.hpp>
#include <boost/preprocessor/seq/for_each.hpp>
#define DEFINE_ENUM_VAL_TO_STR(r, data, elem) \
case BOOST_PP_CAT(data, BOOST_PP_CAT(::, elem)): \
return out << BOOST_PP_STRINGIZE(elem);
#define DEFINE_ENUM_STR_TO_VAL(r, data, elem) \
if (s == BOOST_PP_STRINGIZE(elem)) \
{ i = BOOST_PP_CAT(data, BOOST_PP_CAT(::, elem)) ; } else
#define DEFINE_ENUM(Name, Values) \
struct Name { \
enum type { \
Invalid = 0, \
BOOST_PP_SEQ_ENUM(Values) \
}; \
}; \
typedef Name::type Name##_t; \
std::ostream& operator<<(std::ostream& out, Name##_t i) { \
switch(i) { \
BOOST_PP_SEQ_FOR_EACH(DEFINE_ENUM_VAL_TO_STR, Name, Values) \
default: return out << "~"; } } \
std::istream& operator>>(std::istream& in, Name##_t& i) { \
std::string s; in >> s; \
BOOST_PP_SEQ_FOR_EACH(DEFINE_ENUM_STR_TO_VAL, Name, Values) \
{ i = Name##::Invalid; } }
对象的向量,静态的类型,它还允许我遍历枚举的值,如果心情(或需要)罢工:)
There are better ways, personally I use this little macro to store that all in a nicely sorted vector of pairs, static for the type, it also allows me to iterate through the values of the enum if the mood (or need) strikes :)
这是非常不幸的,虽然这个语言没有任何支持。我宁愿如果有,枚举是相当方便的代码集...
It's quite unfortunate though there is no support in the language for that. I would prefer if there was, enum are quite handy for codesets...
这篇关于是否可以定义enumalpha?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文