在编译时具有未知类型的对象的类

时间:2013-07-23 12:30:59

标签: c++ auto

我确信这个问题在这里被触及了很多次,但我真的找不到我遇到的问题类型的答案。我有一个需要在里面装一个数组的类。但是该数组的类型是可靠的(确切地说,它取决于打开的波形文件的比特率,例如8位 - 字符,16位 - 短等)。我需要在其中一个类方法中定义它。

我的想法是使用auto关键字来声明指针:

class WaveReader {

//

auto *data;

};

然后,在方法内:

void some_func(int datasize)
{
    //
    case 8:
      data = new char[datasize];
      break;
    case 16:
      data = new short[datasize];
      break;
    //
    etc.
}

但这是一个愚蠢的想法。我知道最简单的方法是为每种类型声明数组,但我想知道是否有一种聪明的方法,也许使用一些模板? 非常感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

auto关键字不是为此设计的,请将数据声明为:

void* data;

然后,您可以使用int或enum来跟踪数据类型。如,

typedef enum 
{
    CHAR,
    SHORT
} DataTypeEnum;
...
DataTypeEnum dataType;
...

并按如下方式修改您的代码:

void some_func(int datasize)
{
    //
    case 8:
      data = static_cast<void*>(new char[datasize]);
      dataType = CHAR;
      break;
    case 16:
      data = static_cast<void*>(new short[datasize]);
      dataType = SHORT;
      break;
    //
    etc.
}
...
if( dataType == CHAR )
{
    ...
}
else if ( dataType == SHORT )
{
    ...
}

答案 1 :(得分:1)

您可能想要考虑“这是什么意思”。是的,有些情况下,这种类型(例如由jsidhu解决)的东西正是你想要和需要的。但通常它表明你试图做“不太正确的方式”。

另一种方法是使用虚拟功能:

class Base
{
   public: 
    virtual void do_stuff_with_data() = 0;
}

class CharData
{
  private:
    char * data;

  public:
    CharData(size_t size) { data = new char[size]; }

    void do_stuff_with_data() { ... }; 
};

class ShortData
{
  private:
    short* data;

  public:
    ShortData(size_t size) { data = new short[size]; }
    void do_stuff_with_data() { ... }; 
};

void some_func(int datasize)
{
    Base *pBase;
    case 8:
      pBase = new CharData(datasize);
      break;
    case 16:
      pBase = new ShortData(datasize);
      break;
    //
    etc.

    pBase->do_stuff_with_data(); 
}

答案 2 :(得分:0)

多种数据类型。您可以使用相同的名称创建单独的重载函数。根据传递的数据类型,它将使用正确的功能。 然后,该函数可以使用in。

调用正确的类

答案 3 :(得分:0)

我会使用工会来完成工作:

union {
    int8_t *i8;
    int16_t *i16;
    /* ... */
} data;

// snip

switch (bitsPerSample) {
case 8:
     dataType = CHAR;
     break;
case 16:
     dataType = SHORT;
     break;
default:
     // throw
}

data.i8 = new int8_t[datasize * bitsPerSample / CHAR_BIT];

do_8bit(data.i8);
// or
do_16bit(data.i16);

delete[] data.i8;

由于您只存储POD,因此如果您分配N * 2 char s或N short s无关紧要,并且您可以使用正确的指针类型而不进行强制转换。

另外:来自<inttypes.h>的整数类型,因为“基本”整数类型的绝对大小没有garantuee。