正如尼尔所说,我自己从来没有遇到过这个问题。不过,我遇到了代码集的问题(即从字符串映射到枚举,然后返回)。
我的第一反应是表皮:干燥。
正如您所指出的,维护两个枚举和翻译需要时间,所以最好重构并只使用一个。
我的第二个反应是尝试删除枚举。我不喜欢枚举。也许我会用即将到来的 C++0x 来欣赏它们,但就目前而言,它们比我认为的更麻烦。我更喜欢智能对象,有类别等......
但是,我猜这个问题本身很有趣。所以如果你喜欢处理这种乱七八糟的情况,我不妨试着减轻你的负担。
模板在这里不能做太多事情。我已经将它们用于枚举范围检查以及字符串转换(来回)和迭代,但这就是它们所能做的。但是,正如您所怀疑的那样,Boost.Preprocessor 的一些“微妙”应用程序是可能的。
你想写什么:
DEFINE_CORRESPONDING_ENUMS(Server, Client,
((Server1, 1, Client1, 6))
((Server2, 2, Client2, 3))
((Common1, 4, Common1, 4))
((Common2, 5, Common2, 5))
((Server3, 7, Client3, 1))
);
我们希望它生成:
struct Server
{
enum type { Server1 = 1, Server2 = 2, Common1 = 4, Common2 = 5, Server3 = 7 };
};
struct Client
{
enum type { Client1 = 6, Client2 = 3, Common1 = 4, Common2 = 5, Client3 = 1 };
};
Server::type ServerFromClient(Client::type c)
{
switch(c)
{
case Client1: return Server1;
//...
default: abort();
}
}
Client::type ClientFromServer(Server::type s)
{
//...
}
好消息是,这是可能的。我什至可以做到,尽管我可能会让你做一些工作;)
以下是一些解释:
- 宏的第三个元素是一个序列。序列的大小是无限的。
- 序列的每个元素都是一个 4 元组。您需要提前知道它的大小,因此重复
Common
. 如果您改用序列,则可以处理可变数量的元素(例如,避免重复常见的...),但这会使事情变得更加复杂
- 你需要看一下
BOOST_PP_SEQ_FOREACH
,这将是这里的基本操作。
- 不要忘记
BOOST_PP_CAT
处理标记的串联。
- 在选项
gcc
上-E
产生预处理器输出,它可能会派上用场......
- 不要忘记文件中的注释和使用方法,否则你的同事会讨厌你