与えられた型の挿入演算子があることを検出したいと思います。通常は、適切な署名で過負荷関数が存在することを確認します。私はクラスAを持っているとします。C++特定の型を受け入れる名前で関数が存在するかどうかを検出します。
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
私はそれが同じで、私は演算子が存在すると推測できます。オペレータと< <は、しかし、それはタイプBが言うタイプAに今
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;
}
私はでき
B b;
std::cout << b << std::endl;
のようなものを解決している可能性がありますしかし、その代わりに何
std::ostream&(*)(std::ostream&, B const&)
コンパイラありませんBImplバージョンを使用するようになり、イディオムはBの挿入演算子があることを識別することができません。
関数が特定の型に対して指定されないかもしれないが、特定の型が指定された型に変換されるような、多重定義された関数が存在すると判断できますか?
私は 'B'は、私だけのための1つを見るために挿入演算子を見ていない '' –
vu1p3n0x