[英]Is it possible to declare a variable of unknown type as a class member variable?
[英]Declare variable with unknown type
我在c ++程序中讀取.wav文件。
.wav格式是樣本是uint8_t
或int16_t
。 是否可以根據特定文件的格式聲明變量?
一個解決方案是:
int16_t sample;
if (bits==8)
{
uint8_t temp8;
in.read((char*)&temp8,bits);
sample = (int16_t) temp8;
}
else
{
in.read((char*)&sample,bits);
}
從現在開始我可以使用sample
。 然而,這似乎並不是很方便,在8bit情況下,變量sample
需要的大。
我相信這也可以通過union完成,但它仍然會使變量占用2個字節,無論如何。
我真正想要的是:
if(bits==8)
uint8_t sample;
else
int16_t sample;
但是范圍超出了條件語句。
您可以使用抽象基類和模板類來提供示例讀取器的不同實現。 使用抽象接口,以后的代碼不需要知道它是否處理8位或16位樣本。
#include <fstream>
#include <vector>
#include <exception>
class SampleReader
{
public:
virtual void readSample( std::ifstream &in ) = 0;
};
template<class T>
class SampleReaderT : public SampleReader
{
public:
virtual void readSample( std::ifstream &in )
{
while (!in.eof()) {
const T value = readOneValue(in);
if (in) {
_sample.push_back();
} else {
break;
}
}
}
private:
T readOneValue( std::ifstream &in )
{
T inputUnit;
in.read((char*)&inputUnit,sizeof(T));
}
private:
std::vector<T> _sample;
};
typedef SampleReaderT<int8_t> SampleReader8Bit;
typedef SampleReaderT<int16_t> SampleReader16Bit;
int main(int argc, char** argv)
{
int sampleBits = 8;
SampleReader *sampleReader = nullptr;
if (sampleBits == 8) {
sampleReader = new SampleReader8Bit();
} else if (sampleBits == 16) {
sampleReader = new SampleReader16Bit();
} else {
throw std::out_of_range("unknown bit number");
}
std::ifstream in("test.dat");
sampleReader->readSample(in);
}
請注意此示例中的以下內容:
SampleReader
的指針,而不必知道這是一個8位還是16位的示例讀取器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.