我有一个可以通过网络发送的类型列表,举个例子:
enum types {
E_T1,
E_T2,
E_T3,
E_T4
};
现在我有一个对应于每种类型的类列表,假设每个都被声明为class E_T1 {...}
,class E_T2 {...}
等。
它们不是从公共基类派生的,也不可能这样做。每个类都有一个验证方法,我需要调用通过网络发送的数据。客户端发送数据D
和对应于消息类型的 id。我需要掌握与类型相对应的对象。如果需要,我可以使用 C++0x 功能。
到目前为止,我尝试的是为 . 使用专门的模板,types
为与之相关的对象保存一个 typedef。这显然是一个愚蠢的想法,因为模板参数需要是编译时间常数,所以getType<data.id()>::type
不可能做一些事情。
然后我尝试使用 Boost.Variant 来获得一个像这样的常见可返回类型(使用 mpl 向量在运行时迭代注册的类型以进行调试):
template <typename C>
struct getType() {
typedef C type;
}
typedef boost::mpl::vector<
getType<E_T1>,
getType<E_T2>,
getType<E_TX>...
> _types;
typedef boost::make_variant_over<_types>::type _type;
//use a map to store each type <-> id
boost::unorderd_map<types, _type> m;
m[E_T1] = getType<E_T1>();
m[data.id()]::type x; //<- access type, can now call x.validate(data)
这样做的问题是,每个变体默认限制为 20 个条目。这可以被覆盖,但据我了解,应该考虑每种类型的开销,我们在这里讨论的是几千种类型。
还尝试了 boost.any 但它不包含任何类型信息,所以这又是不可能的。有没有人有什么好主意如何优雅地解决这个问题?寻找我在处理类型时不必编写 1k switch 语句的东西。
所有类型现在都处于编译类型,它们对应的 ID 也是如此。Id -> 类型解析需要在运行时进行。
在此先感谢,罗宾。