2014-07-17 3 views
0

je peux spécialiser un modèle:Spécialiser modèle pour un ensemble de valeurs

template <class T> T f(T x){ ... } 
template <> int f(T x) { ... } 

Pour autant que je sache, je ne peux pas se spécialiser pour un ensemble de T? Par exemple, pour plusieurs types numériques, tels que:

template <class T> T f(T x){ ... } 
template <> (int, double) f(T x) { ... } 

Les paranthèses ronds (int, double) représenterait donc un ensemble de types.

+1

T est le type de retour de la fonction. – dari

+1

Vous pouvez créer une surcharge avec 'std :: enable_if' ou utiliser l'envoi de tags. – Jarod42

+0

Vous devez utiliser std :: enable_if et [type traits] (http://en.cppreference.com/w/cpp/header/type_traits) pour spécifier les caractéristiques du type que vous voulez gérer par la spécialisation partielle. Prenez note que le type de retour sans aucun autre moyen de résoudre la résolution de surcharge vous causerait throuble – NetVipeC

Répondre

2

j'écrire une classe de trait de type pour la commodité (car il n'y en a pas dans la bibliothèque standard) pour vérifier si un type est le même que celui d'une liste de types:

template<typename T, typename U, typename... Ts> 
struct is_any_of : is_any_of<T,Ts...> { }; 

template<typename T, typename... Ts> 
struct is_any_of<T,T, Ts...> : std::true_type { }; 

template<typename T, typename U> 
struct is_any_of<T,U> : std::false_type { }; 

Maintenant, vous peut l'utiliser avec enable_if pour permettre conditionaly la surcharge (pas spécialisation):

template <class T> T f() { /* ... */ } 

// unlike normal functions, function templates can be overloaded on return types! 

template<typename T> 
std::enable_if< 
    is_any_of< T, int, double, float, short, std::complex<double> >::value, 
    T 
>::type 
f() { /* ... */ } 

Cela signifie malheureusement que l'appel à f est ambigu si T se trouve dans la liste des types. Si vous avez vraiment besoin de deux surcharges, vous pouvez corriger cela en faisant la même chose avec l'autre surcharge, seulement avec la condition enable_if inversée (en faisant "disable_if").

+0

@ Jarod42 Faisons semblant que je n'ai jamais écrit ça :) – jrok

+0

C'est un peu trop sophistiqué pour moi en ce moment, je vais devoir lire de la littérature d'abord à même comprendre ce qu'il fait. Mais cela fonctionnerait-il aussi, si le modèle est le modèle , et maintenant je veux l'avoir pour plusieurs valeurs? Ou si c'est un template ? – Michael

Questions connexes