C ++ - 在类的不同模板化版本之间进行转换的方法

时间:2013-08-04 15:05:28

标签: c++ templates downcast

所以,我有一个模板化的类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方法绝对没用。

我欢迎任何意见。 :)

2 个答案:

答案 0 :(得分:1)

您可以使用例如模板get()方法,该方法通过virtual方法转换为要求大小,通过最大支持类型。如果转换会丢失位(在运行时检查),则可能会产生错误。

答案 1 :(得分:0)

我认为在这种情况下,向下倾斜并不是一个好主意。这似乎是一个设计问题。

但是,您可以尝试为这些类实现visitor pattern之类的内容。它可以解决你的问题,但我不确定,因为没有使用B对象的例子。