2013-05-11 87 views
3

是否可以在函數調用中定義一個聯合臨時變量,而不是先前定義它,然後將它傳遞給參數?如何將聯合作爲函數參數傳遞,而無需先定義它?

例子:

  union data_t{ 
      double delaySeconds; 
      float scale; 
      float rotation; 

      }; 

      void someFunction(data_t){} 

現在我想打電話給someFunction,使用任何工會的元素是適當的:

  someFunction(WHAT DO I PUT HERE); 

例如,如果傳遞給需要一個類型的函數包含一個構造函數,您可以在函數調用中定義您的臨時權限。但我嘗試了這種聯盟的各種方式,但沒有運氣。例如,假設我想通過分配給scale一個浮動:

  someFunction(data_t.scale(2.0)); 
+2

如果是我,我會避免像瘟疫那樣的「工會」。 – 2013-05-11 06:39:44

+1

不一定...如果使用正確,工會可以非常強大 – 2013-05-11 06:40:12

+5

爲什麼你不使用重載? – Pubby 2013-05-11 06:40:14

回答

2

您可以定義你的工會構造函數初始化成員。但是,您需要一種機制來區分設置了哪個字段。下面,我定義一個幫手enum,並擴展您的data_t以允許繼承和成員區分。現在

enum data_t_type { DelaySeconds, Scale, Rotation }; 

struct data_t { 
    union { 
     double delaySeconds; 
     float scale; 
     float rotation; 
    }; 
    union { 
     unsigned char flags; 
     struct { 
      unsigned char isDelaySeconds : 1; 
      unsigned char isScale : 1; 
      unsigned char isRotation : 1; 
     }; 
    }; 
    data_t() : flags(0) {} 
}; 

,初始化實際上是一個template,是以data_t_type作爲參數來完成。

template <data_t_type> struct data_type {}; 

template <> struct data_type<DelaySeconds> : data_t { 
    data_type (double x) { delaySeconds = x; isDelaySeconds = 1; } 
}; 

template <> struct data_type<Scale> : data_t { 
    data_type (float x) { scale = x; isScale = 1; } 
}; 

template <> struct data_type<Rotation> : data_t { 
    data_type (float x) { rotation = x; isRotation = 1; } 
}; 

所以,現在,你可以調用你的函數,像這樣:

someFunction(data_type<Scale>(2.0)); 

由於data_type<>data_tsomeFunction()得到正確的類型。

+0

有趣的是,這與我所做的相似,但我在這裏遇到了一個相關問題:http://stackoverflow.com/questions/16494845/all-public-struct-yields-call-to-implicitly-deleted-default -constructor – johnbakers 2013-05-11 07:32:22

+0

'vec3'可能是你的問題。 – jxh 2013-05-11 07:36:04

+0

在C++編程參考中搜索*位域*或*位域*。 – jxh 2013-05-11 07:37:43

相關問題