operator<< をオーバーロードして、 で動作できるようにしたいと思いshared_ptr
ます。
template<typename T>
struct foo
{
virtual foo& operator<<(const T& e) = 0;
};
foo<int> f1;
f1 << 1;
std::shared_ptr<foo<int>> f2(new foo<int>());
f2 << 1;
私の最初の試みは次のとおりですが、問題は、どのクラスの動作も有効にすることです。
template<typename T, typename U>
const std::shared_ptr<T>& operator<<(const std::shared_ptr<T>& o, const U& e)
{
*o << e;
return o;
}
私の2番目の試みは次のとおりです。
template<typename T, typename U>
const std::shared_ptr<foo<T>>& operator<<(const std::shared_ptr<foo<T>>& o, const U& e)
{
*o << e;
return o;
}
このソリューションの問題は、T
自動的に推定できないため、foo を継承する型では機能しません。
したがって、スキップU
して代わりに使用することもできますT
。その場合、 T は 2 番目の引数から推定され、 の引数o
は に変換できますfoo<T>
。
template<typename T, typename U>
const std::shared_ptr<foo<T>>& operator<<(const std::shared_ptr<foo<T>>& o, const T& e)
{
*o << e;
return o;
}
ただし、次の場合は機能しません。
struct c
{
};
struct a
{
a();
a(c); // implicit conversion
};
struct b
{
operator a(); // implicit conversion
};
auto f = std::make_shared<foo<a>>();
f << c; // doesn't work.
f << b; // doesn't work.
実用的なソリューションを作成する方法についてのアイデアはありますか?