gpt4 book ai didi

c++ - operator<< 智能指针重载

转载 作者:太空狗 更新时间:2023-10-29 21:27:44 25 4
gpt4 key购买 nike

我想重载 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相反,在这种情况下,将从第二个参数和 o 的参数推导出 T可以转换成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.

关于如何制定可行的解决方案有什么想法吗?

最佳答案

一些选项,请参阅 https://ideone.com/26nqr 的第二个直播

给定

#include <iostream>
#include <memory>
using namespace std;

template<typename T> struct foo {
virtual foo& operator<<(const T& e) const { std::cout << "check foo\n"; }
};

//////
// derived instances

struct derived : foo<int> {
virtual derived& operator<<(const int& e) const { std::cout << "check derived\n"; }
};

template<typename T> struct genericDerived : foo<T> {
virtual derived& operator<<(const T& e) const { std::cout << "check genericDerived\n"; }
};

简单:模板模板参数

template<typename T, typename U, template <typename> class X>
const std::shared_ptr<X<T>>& operator<<(const std::shared_ptr<X<T>>& o, const U& e)
{
*o << e;
return o;
}

int main()
{
auto f = make_shared<foo<int>>();
f << 1;

auto d = make_shared<derived>();
d << 2; // compile error

auto g = make_shared<genericDerived<int>>();
g << 3; // SUCCESS!
}

完成者:SFINAE

上面没有捕获派生类(案例 2)。为此,我会求助于

#include <type_traits>
namespace detail
{
template<typename Foo, typename T>
const std::shared_ptr<Foo>& dispatch_lshift(
const std::shared_ptr<Foo>& o, const T& e,
const std::true_type& enabler)
{
*o << e;
return o;
}
}

template<typename Foo, typename T>
const std::shared_ptr<Foo>& operator<<(const std::shared_ptr<Foo>& o, const T& e)
{
return detail::dispatch_lshift(o, e, std::is_convertible<Foo*, foo<T>* >());
}

int main()
{
auto f = make_shared<foo<int>>();
f << 1;

auto d = make_shared<derived>();
d << 2;

auto g = make_shared<genericDerived<int>>();
g << 3;

auto x = make_shared<int>();
// x << 4; // correctly FAILS to compile
}

关于c++ - operator<< 智能指针重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8701112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com