Ich möchte erkennen, dass es einen Einfügeoperator für einen bestimmten Typ gibt. Normalerweise würde ich überprüfen, ob eine überladene Funktion mit der richtigen Signatur existiert. Sagen, dass ich eine Klasse A haben, dannC++ Ermitteln, ob es eine Funktion nach Name gibt, die einen bestimmten Typ akzeptiert
template<typename T>
struct insert_operator_type
{
using type = typename std::ostream&(*)(std::ostream&, const T&);
};
...
std::is_same<
decltype(static_cast<typename insert_operator_type<A>::type> (&operator<<)),
std::ostream&(*)(std::ostream&, A const&)
>::value
mir sagen, werden sie gleich sind, und ich kann ableiten, dass der Bediener vorhanden ist. Mit Operator < < jedoch ist es möglich, dass ein Typ B ein Typ A. löst sich in etwas sagen wie
template<typename T>
class A
{
public:
T* type1 = nullptr;
};
typedef A<int> BImpl;
class B : public BImpl
{
public:
B() {}
};
template<typename T>
std::ostream& operator<<(std::ostream& os, const A<T>& a)
{
os << "printing A<T>" << std::endl;
return os;
}
Jetzt kann ich
B b;
std::cout << b << std::endl;
Aber es gibt keine
std::ostream&(*)(std::ostream&, B const&)
anstelle der Compiler stellt fest, dass die BImpl-Version verwendet wird und das Idiom nicht erkennt, dass es einen Einfügungsoperator für B gibt.
Kann ich feststellen, dass eine überladene Funktion vorhanden ist, so dass die Funktion möglicherweise nicht für einen bestimmten Typ angegeben wird, aber für einen Typ, den der angegebene Typ konvertiert?
Ich sehe eine Einfügeoperator nicht für 'B', ich sehe man nur für 'A' –
vu1p3n0x