C++——在类的不同模板版本之间进行强制转换的方法

C++ -- Method for Casting between different Templated versions of a class

本文关键字:转换 之间 方法 C++ 版本      更新时间:2023-10-16

因此,我有一个模板化类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类的运行时类型,也就是说,使强制转换方法完全无用。

我欢迎任何意见。:)

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

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

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