2013-10-06 62 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* 
} 
相關問題