Étant donné le code suivant:problèmes avec la résolution de surcharge et l'opérateur << pour les types - Partie 2 templated
#include <string>
#include <type_traits>
#include <sstream>
#include <vector>
#include <iostream>
using namespace std;
namespace has_insertion_operator_impl {
typedef char no;
typedef char yes[2];
struct any_t {
template <typename T>
any_t(T const&);
};
no operator<<(ostream const&, any_t const&);
yes& test(ostream&);
no test(no);
template <typename T>
struct has_insertion_operator {
static ostream& s;
static T const& t;
static bool const value = sizeof(test(s << t)) == sizeof(yes);
};
}
template <typename T>
struct has_insertion_operator : has_insertion_operator_impl::has_insertion_operator<T> {};
template <class T>
typename enable_if<has_insertion_operator<T>::value, string>::type stringify(const T& in) {
stringstream stream;
stream << in;
return stream.str();
}
template <class T>
typename enable_if< ! has_insertion_operator<T>::value, string>::type stringify(const T&) {
return "{?}";
}
// ======= OVERLOADS PROVIDED BY THE USER =======
template<typename T, typename T2>
struct myType { T data; T2 op; };
template<typename T, typename T2>
ostream& operator<<(ostream& s, const myType<T, T2>&) { s << "myType"; return s; }
template<typename T>
ostream& operator<<(ostream& s, const vector<T>&) { s << "vector<T>"; return s; }
template<typename T, typename A>
ostream& operator<<(ostream& s, const vector<T, A>&) { s << "vector<T, A>"; return s; }
int main() {
myType<int, float> a; cout << stringify(a) << endl; // prints "myType"
cout << stringify(6) << endl; // prints "6"
vector<int> v(5); cout << stringify(v) << endl; // prints "{?}"
return 0;
}
Pourquoi le modèle myType<>
obtenir, mais le type de chaîne de caractères vector<>
ne pas basé sur un modèle?
Pour le type vector<>
je reçois la valeur par défaut {?}
mise en chaîne mais je veux bien l'une des surcharges au fond d'être appelé - comme avec myType<>
EDIT:
La question réelle ici est Pourquoi le has_insertion_operator<vector<int>>
est-il faux?
Je dois aussi cela en C++ 98
et doit être fourni après stringify()
les operator<<
Surcharges électriques - comme avec myType<>
Il est évident que le vecteur n'est pas stringifié. La question peut être simplifiée en "Pourquoi est-ce que' has_insertion_operator> 'false?" –
user2079303
@ user2079303: Qu'est-ce qui est "évident" à ce sujet? Il y a un 'ostream & operator << (ostream & s, const vector &)' juste là. –
@ LightnessRacesinOrbit bien en fait il a raison - c'est la faute du trait - il conduit le '' 'enable_if <>' '' et le SFINAE – onqtam