2017-05-08 72 views
-1

假設我有一個聯盟:C++模板的方法來專門聯合類型

union U{ 
    int i; 
    float f; 
}; 

我想寫使用它作爲一個float或者int的通用方法。就像這樣:

template <typename T> 
T sum(std::vector<U> vec){ 
    T res(0); 
    for (U &v: vec){ 
     res += ... // use v.i or v.f depending on what T is 
    } 
    return res; 
} 

有沒有辦法做到這一點?這只是一個示例方法。我有一個更長,更復雜的方法,我不想複製它只是爲了切換它使用的聯合類型。

+0

爲什麼你說'typedef'? –

+0

我忘了你可以在沒有typedef的情況下命名工會。 – Azmisov

回答

2

專業化將工作:

template <typename T> T const & get(U const &); 

template <> int const & get<int>(U const & u) { return u.i; } 
template <> float const & get<float>(U const & u) { return u.f; } 

用法:

for (U & v : vec) { res += get<T>(v); } 
+0

[Demo](https://ideone.com/d231kr) –

+0

有趣;我正在考慮類似的事情。你會說這是做這種事的最乾淨的方式嗎? – Azmisov

+1

@Azmisov:鑑於你開始有一個工會矢量(!),我會說我們很久以前就乾乾淨淨地做事! –