Joh*_*ohm 6 c++ arrays enums visibility
考虑一个C++类,它导出一个枚举,在该枚举上维护一个内部数组,并希望导出一个接受枚举值的命令.
class foo {
public:
enum color {
red,
yellow,
green,
NUM_COLORS
};
private:
something somebody[NUM_COLORS];
public:
void command(color c);
};
Run Code Online (Sandbox Code Playgroud)
是否有一种干净的方法只能导出实际颜色,而不是NUM_COLORS?当编译器的类型系统真的应该能够为我做这件事时,我不想在每次调用时检查边缘情况.
明显的黑客是:
class foo {
public:
enum color {
red,
yellow,
green
};
private:
/* something like */ const unsigned NUM_COLORS = green+1;
unsigned LEDs_in_stock[NUM_COLORS];
public:
void command(color c);
};
Run Code Online (Sandbox Code Playgroud)
这当然是一个滴答作响的定时炸弹,等待一些可怜的过度工作的维护程序员添加蓝色LED的配置,并忘记更新NUM_COLORS行.
让我澄清一下.在这种特殊情况下,我想要的是能够说:
class foo {
public:
enum color {
red,
yellow,
green
};
void command(color c);
private:
something somebody[color];
};
Run Code Online (Sandbox Code Playgroud)
据我所知,C++不允许这样做.
我的第一个想法是尝试解决问题,但经过一番反思后,我会将负担转移到command:
void command(color c) {
assert(0 <= c && c < NUM_COLORS && "Invalid argument");
}
Run Code Online (Sandbox Code Playgroud)
由于枚举是很弱的类型,因此您无论如何都需要检查输入,因为任何人都可以轻松提供蹩脚的参数:
Foo foo;
foo.command(static_cast<Foo::color>(3)); // 3 is green, right ?
Run Code Online (Sandbox Code Playgroud)
原解决方案:
class Foo {
struct impl { enum { red, yellow, green, NUM_COLORS }; };
public:
enum color { red = impl::red, yellow = impl::yellow, green = impl::green };
void command(color c);
};
Run Code Online (Sandbox Code Playgroud)
不幸的是,存在大量重复(实际上是我最初输入的,尽管您从不直接引用 的值green = impl::yellow;并不重要)。impl
否则,总有宏观技巧:
#define MY_DEFINE_ENUM(Type, Elements) \
enum Type { BOOST_PP_SEQ_ENUM(Elements) }; \
inline size_t size(Type) { return BOOST_PP_SEQ_SIZE(Elements); }
Run Code Online (Sandbox Code Playgroud)
它使用邪恶的宏和晦涩的预处理器机制来避免代码重复。显然它只适用于连续的枚举元素(它返回元素的数量,而不是最大数量)。
| 归档时间: |
|
| 查看次数: |
2594 次 |
| 最近记录: |