使用智能指针进行部分专业化的正确语法

Correct syntax for partial specialization with smart pointers

我有这个功能

template<class A, class B>
std::shared_ptr<A> Foo(const B& obj) { ... }

而且我想提供一个方便的函数,它也可以获取智能指针(shared_ptrunique_ptr)而不是引用。像这样:

template<class A, class B>
std::shared_ptr<A> Foo(const std::shared_ptr<B>& obj) {
  return Foo<A>(const_cast<const B&>(*obj));
}

只有当我重载 Foo 以获取 shared_ptr 作为参数时,它才会像那样工作。但是,我想将其编写为部分专业化。我也试过

template<class A>
template<class B>
std::shared_ptr<A> Foo(const std::shared_ptr<B>& obj) { ... }

这个偏特化的正确语法是什么?

您不能部分 特化函数模板。但是,您可以安全地依赖当前的解决方案。 有两个函数重载:

template<class A, class B>
std::shared_ptr<A> Foo(const B& obj);

template<class A, class B>
std::shared_ptr<A> Foo(const std::shared_ptr<B>& obj);

后者被编译器视为 更专业 * 由于偏序的重载决议,因此,只要传入匹配的 std::shared_ptr<T> 就会选择它作为论据。


* const std::shared_ptr<B>&const B& 更特殊,因为对于某些独特的类型 Uniqueconst B& 中的 B 可以从 const std::shared_ptr<Unique>&,但在反场景中,对于带有 const Unique& 参数推导 Bconst std::shared_ptr<B>& 参数失败。