gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:29:09 26 4
gpt4 key购买 nike

所以,我有一个模板类,B , 继承自非模板类 A .现在,这个模板版本 B , 有一组四个有效且已知的模板类,称它们为 B<uint8_t>, B<uint16_t>, B<uint32_t>, B<uint64_t> .

目前,我将这些存储在 map 中,boost::unordered_map<std::string, A> ,我想创建一些方法来转换为不同的类型。我可以根据 A::width() 轻松区分方法分别返回 8、16、32 或 64。

我一直在为一个好的设计绞尽脑汁,但我想不出比让每个 use 自己转换更好的解决方案。

这是一个最小的工作案例:

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 方法完全无用。

我欢迎任何意见。 :)

最佳答案

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

关于C++——在一个类的不同模板化版本之间进行转换的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18044346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com