我想重载 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;
}
我的第二次尝试如下:
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;
}
此解决方案的问题不适用于继承 foo 的类型,因为T
无法自动推断。
所以我可以跳过U
并T
改用,在这种情况下,将从第二个参数推导出 T 并且参数 foro
可以转换为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.
关于如何制定可行的解决方案的任何想法?