C++ 函数模板参数推导

C++ function template argument deduction

我有一个 class 智能指针模板,我想要一个 operator+()

template<typename T, typename U>
class Foo{};

template<typename T, typename U>
std::unique_ptr<Foo<T,U>> operator+(std::shared_ptr<const Foo<T, U>>, std::shared_ptr<const Foo<T, U>>);

我现在希望以下内容与模板参数推导一起使用:

std::shared_ptr<Foo<T, U>> a, b, c;

auto d = a + b + c;

当然不是,因为ab是指向非常量的指针,而不是指向常量的指针。它也不起作用,因为 a + b 是唯一指针而不是共享指针。

有没有一个优雅的解决方案可以使这个推论有效?使用运算符,我真的不想显式指定模板参数。我看到的唯一可行的方法是为 shared_ptrunique_ptr 的所有排列以及 const 和非常量重载 operator+,但这是要编写的 16 个函数定义。

实施一个模板,采用对 Foo 的 const 引用,然后使用使用此实施的任意参数创建另一个模板。

以下创建总是 returns unique_ptr 包含默认初始化 Foo.

template<typename T, typename U>
class Foo{};

template<typename T, typename U>
std::unique_ptr<Foo<T,U>> add_foos(const Foo<T, U>& f1, const Foo<T, U>& f2)
{
    return std::make_unique<Foo<T, U>>();
}

template<typename T, typename U>
auto operator+(T t, U u)
{
    // use the function above here
    return add_foos(*t, *u);
}

编辑:

使用评论中的@NathanOlivers 建议:最好不要将其应用于与 Foo

无关的操作数