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").
T est le type de retour de la fonction. – dari
Vous pouvez créer une surcharge avec 'std :: enable_if' ou utiliser l'envoi de tags. – Jarod42
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