Je veux fournir deux implémentations différentes d'un operator>>
selon que le type donné est une sous-classe d'un type particulier:std :: is_base_of pour le paramètre de fonction vectorielle basé sur un modèle
class A {};
class B : public A{};
class C {};
template<typename T>
std::istream& operator>>(std::istream& is,
std::vector<typename std::enable_if<std::is_base_of<A, T>::value>::type>& vec)
{
std::cout << "Special case called" << std::endl;
return is;
}
template<typename T>
std::istream& operator>>(std::istream& is,
std::vector<T>& vec)
{
std::cout << "General case called" << std::endl;
return is;
}
void main(int argc, char **argv)
{
std::vector<A> a;
std::vector<B> b;
std::vector<C> c;
std::stringstream ss("A string");
ss >> a;
ss >> b;
ss >> c;
}
qui imprime
General case called
General case called
General case called
Modification de la deuxième définition de l'opérateur à
template<typename T>
std::istream& operator>>(std::istream& is,
std::vector<typename std::enable_if<!std::is_base_of<A, T>::value>::type>& vec)
{
std::cout << "General case called" << std::endl;
return is;
}
Est-ce ne compilera pas à cause de
error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::stringstream'
Je me sers probablement std::enable_if
mal. Mais qu'est-ce qui est correct? Y a-t-il des problèmes avec le modèle std::vector
ici?
Merci beaucoup, cela résout le problème! J'ai une courte question complémentaire: Puis-je fournir une troisième spécialisation explicite?'' template <> std :: istream & opérateur >> (std :: istream & est, std :: vector & vec) {...} '' ne compile pas à cause de '' erreur C2794: 'type': n'est pas un membre de toute classe de base directe ou indirecte de 'std :: enable_if ' '' –
PhilLab
@PhilLab préfèrent la surcharge sur la fonction de spécialisation –
duuhhh, j'ai raté l'évidence :-). si tout ce que vous avez est un marteau, tout ressemble à un clou – PhilLab