所以,我有一个模板类,B
它继承自一个非模板类A
。现在,这个模板化版本B
,有一组四个有效且已知的模板类,称为它们B<uint8_t>, B<uint16_t>, B<uint32_t>, B<uint64_t>
。
目前,我将这些存储在地图中boost::unordered_map<std::string, A>
,并且我想创建一些方法来转换为不同的类型。我可以根据A::width()
分别返回 8、16、32 或 64 的方法轻松区分。
我一直在为一个好的设计绞尽脑汁,但我想不出一种方法来获得比每次使用都自己铸造更好的解决方案。
这是一个最小的工作案例:
class A {
std::size_t width() const = 0;
};
template <typename value> class B : public A {
std::size_t width() const {
return sizeof(value) * 8;
}
};
使用范围内:
boost::unordered_map<std::string, A *> _bmap;
template <class T> T cast_A(A * const a) {
switch (a->width()) {
case 8: return dynamic_cast<B<uint8_t> *>(a);
// removed for brevity
}
这样做的问题是它迫使用户在A
之后检查类的运行时类型,也就是使 cast 方法完全没用。
我欢迎任何意见。:)