C++ 使用智能指针进行部分专门化的正确语法
我有这个功能C++ 使用智能指针进行部分专门化的正确语法,c++,templates,template-specialization,C++,Templates,Template Specialization,我有这个功能 模板 std::sharedptrfoo(const B&obj){…} 我想提供一个方便的函数,它还可以获取智能指针(shared_ptr或unique_ptr),而不是引用。大概是这样的: 模板 std::shared_ptr Foo(const std::shared_ptr&obj){ 返回Foo(const_cast(*obj)); } 只有当我重载Foo以获取shared\u ptr作为参数时,它才会这样工作。然而,我想把它写成一个局部的专门化。我也试过了 模板 模
模板
std::sharedptrfoo(const B&obj){…}
我想提供一个方便的函数,它还可以获取智能指针(shared_ptr
或unique_ptr
),而不是引用。大概是这样的:
模板
std::shared_ptr Foo(const std::shared_ptr&obj){
返回Foo(const_cast(*obj));
}
只有当我重载Foo
以获取shared\u ptr
作为参数时,它才会这样工作。然而,我想把它写成一个局部的专门化。我也试过了
模板
模板
std::shared_ptr Foo(const std::shared_ptr&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::共享_ptr Foo(const B&obj);
模板
std::shared_ptr Foo(const std::shared_ptr&obj);
由于偏序,编译器认为后者在重载解析中更为专业化*,因此,只要将匹配的std::shared_ptr
作为参数传入,就会选择后者
*
const std::shared\u ptr&
比const B&
更专业,因为对于某些唯一类型unique
,const B&
中的B
可以从const std::shared\u ptr&
中推导出来,但在相反的情况下,对于带有const Unique&
参数的const std::shared_ptr&
参数,B
的参数推导失败。函数模板不能部分专用。用一个静态成员函数和一个转发给类的泛型函数模板来编写它。@Andrew重载应该足够了(由于偏序)@PiotrSkotnicki确实应该。你为什么要将它作为部分专用化?哦,他们不能!我接受这个答案@雅克,因为我觉得这比超负荷更有意义。