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

时间:2015-10-02 08:53:48

标签: c++ templates template-specialization

我有这个功能

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) { ... }

这种部分专业化的正确语法是什么?

1 个答案:

答案 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&更专业,因为对于某些唯一类型UniqueB中的const B&可以从const std::shared_ptr<Unique>&中推断出来,但在计数器方案中,const std::shared_ptr<B>&参数的const Unique&参数扣除B失败。