所以,我有一个模板化的类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方法绝对没用。
我欢迎任何意见。 :)
答案 0 :(得分:1)
您可以使用例如模板get()
方法,该方法通过virtual
方法转换为要求大小,通过最大支持类型。如果转换会丢失位(在运行时检查),则可能会产生错误。
答案 1 :(得分:0)
我认为在这种情况下,向下倾斜并不是一个好主意。这似乎是一个设计问题。
但是,您可以尝试为这些类实现visitor pattern之类的内容。它可以解决你的问题,但我不确定,因为没有使用B对象的例子。