C++——在类的不同模板版本之间进行强制转换的方法
C++ -- Method for Casting between different Templated versions of a class
因此,我有一个模板化类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对象的使用示例。
相关文章:
- 构造函数和转换运算符之间的重载解析
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- Cxx.jl 在 Julia Complex 和 std::complex 之间进行转换
- 如何在 std::string 和 Aws::String 之间进行转换?
- 转换字符时Arduino DUE 和 Arduino UNO 之间的区别
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 在 Rcpp 中的字符串类型之间转换时出错
- 如何声明不同类型的模板化类之间的转换
- C 和 C++ 中的函数指针转换之间的差异
- 与浮点转换之间的规范化整数
- 重新解释强制转换和 C 样式转换之间的 C++ 区别
- C++ get 和类型转换之间的用法有什么区别?我应该使用哪一个?
- printf函数参数之间的序列点;转换之间的顺序点是否重要
- Clang和GCC中不明确基类转换之间的行为差异
- 转换之间的双和字节数组,为传输ZigBee API
- 隐式转换和显式转换之间的区别
- interpret_cast和C样式强制转换之间的区别是什么