2017-05-08 2 views
-1

Supposons que j'ai une union:C++ méthode de modèle pour spécialiser types d'union

union U{ 
    int i; 
    float f; 
}; 

Je veux écrire une méthode générique qu'il utilise comme un flotteur ou int. Quelque chose comme ceci:

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; 
} 

Y at-il un moyen de faire cela? C'était juste une méthode d'exemple. J'ai une méthode beaucoup plus longue et compliquée, et je ne veux pas la dupliquer juste pour changer le type d'union utilisé.

+0

Pourquoi dis-tu 'typedef'? –

+0

J'ai oublié que vous pouviez nommer des syndicats sans typedef. – Azmisov

Répondre

2

Spécialité travaillerait:

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; } 

Utilisation:

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

[Démo] (https://ideone.com/d231kr) –

+0

Intéressant; Je pensais à quelque chose de similaire. Diriez-vous que c'est la façon la plus propre de faire quelque chose comme ça? – Azmisov

+1

@Azmisov: Étant donné que vous commencez à avoir un vecteur de syndicats (!), Je dirais que nous avons depuis longtemps fait les choses proprement! –