【发布时间】:2015-08-31 09:13:57
【问题描述】:
在下面的代码中,我有一个名为IDecoder 的接口,它应该由任何解码器类实现(此处为DecoderA 和DecoderB)。 IDecoder 中有一个bitset<>,因此我将IDecoder 设为模板类,bitset 的大小在派生类中确定。我还有一个 Container 类,它应该包含一个指向 IDecoder 类的指针,但是由于 IDecoder 不是一个完整的类型,我添加了一个虚拟的 DecoderBase 类,IDecoder 从中继承:
#include <iostream>
#include <bitset>
class DecoderBase
{
public:
DecoderBase(){}
virtual ~DecoderBase(){}
};
template<size_t nb>
class IDecoder : public DecoderBase
{
public:
IDecoder(){}
virtual ~IDecoder(){}
virtual std::bitset<nb> GetDecodedFields() = 0;
};
const int DecoderAMaxFields = 100;
const int DecoderBMaxFields = 200;
class DecoderA : public IDecoder<DecoderAMaxFields>
{
public:
DecoderA(){}
~DecoderA(){}
std::bitset<DecoderAMaxFields> GetDecodedFields()
{
std::bitset<DecoderAMaxFields> bits;
// assume we've decoded fileds number 1 and 10 here
bits[1] = 1;
bits[10] = 1;
return bits;
}
};
class DecoderB : public IDecoder<DecoderBMaxFields>
{
public:
DecoderB(){}
~DecoderB(){}
std::bitset<DecoderBMaxFields> GetDecodedFields()
{
std::bitset<DecoderBMaxFields> bits;
// assume we've decoded fileds number 11, 29, 110 & 142 here
bits[11] = 1;
bits[29] = 1;
bits[110] = 1;
bits[142] = 1;
return bits;
}
};
class Container
{
public:
Container(){}
virtual ~Container(){}
void SetDecoder(DecoderBase* decoder)
{
mDecoder = decoder;
}
DecoderBase* GetDecoder()
{
return mDecoder;
}
private:
DecoderBase* mDecoder;
};
int main()
{
Container container;
container.SetDecoder(new DecoderA());
((DecoderA*)container.GetDecoder())->GetDecodedFields();
return 0;
}
如您所见,在调用GetDecodedFields() 之前,我必须将其转换为其中一个解码器,这与多态的目的完全相反!如何修复此代码?我也考虑过使用boost::dynamic_bitset,但我不想使用它,因为它比正常的bitset 慢。
【问题讨论】:
-
您想要实现什么(功能上)(
bitset是用来做什么的)? -
Container使用什么样的Decoder是运行时信息,而bitset的大小必须在编译时声明。这两个概念不能一起工作。你应该考虑使用vector<bool>。 -
BTW:
std::bitset<100>和std::bitset<200>的类型不同。没有可以用作基类的类型std::bitset。这不是模板的工作方式。所以DecoderBase无法知道你要返回哪些类型。 -
dynamic_bitset不可避免地会稍微慢一些——但这对你的目的真的很重要吗?它看起来确实是解决您的问题的最简单方法。 -
@bobah 我需要这个 bitset 进行按位运算,以便我可以快速知道哪些字段已被解码。
标签: c++ templates polymorphism bitset