簡體   English   中英

聲明具有未知類型的變量

[英]Declare variable with unknown type

我在c ++程序中讀取.wav文件。

.wav格式是樣本是uint8_tint16_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM