Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用智能指针进行部分专门化的正确语法_C++_Templates_Template Specialization - Fatal编程技术网

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确实应该。你为什么要将它作为部分专用化?哦,他们不能!我接受这个答案@雅克,因为我觉得这比超负荷更有意义。