2013-10-06 63 views
1

如何在运行时定义函数内部的返回类型?我有一个成员char * m_data;我想在不同情况下将m_data转换为不同的类型。有没有办法在C++中定义函数体内的返回类型?

?type? getData() const 
{ 
    switch(this->p_header->WAVE_F.bitsPerSample) 
    { 
     case 8: 
     { 
      // return type const char * 
      break; 
     } 
     case 16: 
     { 
      // return type const short * 
      break; 
     } 
     case 32: 
     { 
      // return type const int * 
      break; 
     } 
    } 
} 
+0

将来电者总是知道哪些数据类型将被退回?如果不是,你将如何调用这个函数? – Joni

+1

您可以返回'void *'并在您访问结果时进行强制转换。 – harpun

+0

实际上更好的方法是创建一个'iterator',它将得到由'bitsPerSample'等动态分配的“stepsize” – Valerij

回答

2

不,但正如你总是返回一个指针,你可以返回一个void*。当心调用者将别无选择,要弄清楚什么是指针的背后,所以你最好尝试boost::variant<char*,short*,int*>boost::any/cdiggins::any

+0

调用者仍然必须知道使用'boost :: variant <>'/ 'boost :: any'或'void *',没关系。 – hauzer

+0

@hauzer:至少使用'variant'或'any',调用者只需要*怀疑*类型是什么,如果他们错了,他们可以动态地找到(因此他们可以做几次尝试,或者用'他们可以使用'which()'或'apply_visitor')。用'void *'他们实际上必须知道* :-) –

2

包裹的返回值做一个getter方法bitsPerSample,让来电者选择适当的方法之一:

int getBitsPerSample(){ 
    return p_header->WAVE_F.bitsPerSample; 
} 

const char* getDataAsCharPtr() { 
    // return type const char * 
} 

const short* getDataAsShortPtr() { 
    // return type const short * 
} 

const int* getDataAsIntPtr() { 
    // return type const int * 
} 
+0

我正在写这个答案:-) Upvoted你的。 – rwols

0

不是直接的,我建议使用类似:

const char* getDataAsChar() const 
{ 
    if (this->p_header->WAVE_F.bitsPerSample != 8) return nullptr; 
    //return data as const char* 
} 

const short* getDataAsShort() const 
{ 
    if (this->p_header->WAVE_F.bitsPerSample != 16) return nullptr; 
    //return data as const short* 
} 

const int* getDataAsInt() const 
{ 
    if (this->p_header->WAVE_F.bitsPerSample != 32) return nullptr; 
    //return data as const int* 
} 
相关问题