2017-05-08 76 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:鉴于你开始有一个工会矢量(!),我会说我们很久以前就干干净净地做事! –