我有这个功能
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) { ... }
这种部分专业化的正确语法是什么?
答案 0 :(得分:1)
您不能部分专门化功能模板。但是,您可以放心地依赖当前的解决方案。 有两个函数重载:
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>
作为参数传入,就会被选中。 / p>
* const std::shared_ptr<B>&
比const B&
更专业,因为对于某些唯一类型Unique
,B
中的const B&
可以从const std::shared_ptr<Unique>&
中推断出来,但在计数器方案中,const std::shared_ptr<B>&
参数的const Unique&
参数扣除B
失败。