0

所以,我有一个模板类,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 方法完全没用。

我欢迎任何意见。:)

4

2 回答 2

1

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

于 2013-08-04T15:13:19.323 回答
0

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

但是,您可以尝试为这些类实现类似访问者模式的东西。它可能会解决您的问题,但我不确定,因为没有 B 对象的使用示例。

于 2013-08-04T15:23:23.723 回答