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;
当然不是,因为a
和b
是指向非常量的指针,而不是指向常量的指针。它也不起作用,因为 a + b
是唯一指针而不是共享指针。
有没有一个优雅的解决方案可以使这个推论有效?使用运算符,我真的不想显式指定模板参数。我看到的唯一可行的方法是为 shared_ptr
和 unique_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
无关的操作数
我有一个 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;
当然不是,因为a
和b
是指向非常量的指针,而不是指向常量的指针。它也不起作用,因为 a + b
是唯一指针而不是共享指针。
有没有一个优雅的解决方案可以使这个推论有效?使用运算符,我真的不想显式指定模板参数。我看到的唯一可行的方法是为 shared_ptr
和 unique_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