Vous pouvez obtenir sorte de ce comportement en faisant la fonction de membre d'un modèle de fonction membre et en utilisant SFINAE (échec de substitution n'est pas une erreur). Par exemple:
template <typename U>
typename std::enable_if<!std::is_integral<U>::value &&
std::is_same<T, U>::value, void>::type
f(const Foo<U>& x)
{
}
template <typename U>
typename std::enable_if<std::is_integral<U>::value &&
std::is_same<T, U>::value, void>::type
f(const Foo<U>& x)
{
}
Le test de trait de type is_integral
si U
est un type entier. Si ce n'est pas le cas, le premier est instancié; si c'est le cas, la seconde est instanciée.
Les tests de caractéristiques de type is_same
pour assurer T
et U
sont du même type. Ceci est utilisé pour s'assurer que le modèle de fonction membre n'est instancié pour aucun type autre que Foo<T>
.
Cet exemple utilise la bibliothèque C++ 0x <type_traits>
; Boost a également a type traits library que vous pouvez utiliser, qui fonctionne la plupart du temps la même chose.
AFAIK ce n'est pas possible. – Tronic
Notez que votre fonction ne peut pas s'appeler 'do', puisque' do' est un mot-clé. –
Oubliez les inline. Inline est un concept que nous en tant que programmeurs devrions ignorer et laisser aux dieux informatiques suprêmes (AKA comme compilateurs) –