使用智能指针进行部分专业化的正确语法
Correct syntax for partial specialization with smart pointers
我有这个功能
template<class A, class B>
std::shared_ptr<A> Foo(const B& obj) { ... }
而且我想提供一个方便的函数,它也可以获取智能指针(shared_ptr
或 unique_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&
更特殊,因为对于某些独特的类型 Unique
,const B&
中的 B
可以从 const std::shared_ptr<Unique>&
,但在反场景中,对于带有 const Unique&
参数推导 B
的 const std::shared_ptr<B>&
参数失败。
我有这个功能
template<class A, class B>
std::shared_ptr<A> Foo(const B& obj) { ... }
而且我想提供一个方便的函数,它也可以获取智能指针(shared_ptr
或 unique_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&
更特殊,因为对于某些独特的类型 Unique
,const B&
中的 B
可以从 const std::shared_ptr<Unique>&
,但在反场景中,对于带有 const Unique&
参数推导 B
的 const std::shared_ptr<B>&
参数失败。