2015-09-14 62 views
1

的unique_ptr有一个选项来采取数组类型 - 以具有正确的删除器(与数组中删除[])后:类型模板特(的unique_ptr数组类型)

std::unique_ptr<std::string[]> up(new std::string[10]); // OK

的unique_ptr类本身的定义包括这种类型的专业化(注意定义本身邻近T []括号):

template<typename T, typename D> 
class unique_ptr<T[], D> { ... } 

,但不是它的字符串[]或INT []本身类型 所以应该模板到T型根据def因为不是T []? 换句话说,模板引擎在T和T []之间有什么区别?(如果我们只是用T代替string [] - T []专精应该给我们string [] []类型,或者它不应该是? 只是typedef int []为array_to_int类型wouldnt T []替换为array_to_int []类型(即int [] []类型)?

换句话说,我们明确地将std :: string [] TYPE传递给template in ?这里 std::unique_ptr<std::string[]> ,它应该被取代为T本身,右不T []

回答

3

有被声明如下std::unique_ptr<_Ty, _Dx>类模板的部分特:

template<class _Ty, class _Dx> 
class unique_ptr<_Ty[], _Dx> ... // this is the partial specialization 

通过模板扣除规则,当模板参数_TyT[]时,选择部分专业化。该部分专业化提供了std::unique_ptr<_Ty[], _Dx>特有的功能,例如operator[](未为非数组模板参数定义)。

为模板特

要首先选择的过程中,主要的模板始终是抬头的一个。然后用该模板类或模板函数的任何可用特化来检查实例化模板类或模板函数的参数。在此之后,选择最专业的一个(最佳匹配)。在你的情况下,std::string[]匹配的T[]专用比它更多的匹配T从主要模板。

+0

但为什么提供的类型(比如说int [])本身不能替代T?即为什么它是替代T + [] – barney

+1

@ barney这可能有助于将局部特化看作模式匹配。你不提供参数给部分专业化;相反,如果提供给主模板的参数匹配模式,将会使用它。 –

+0

@ T.C。所以当我写部分专业化和扩展类型T与[]或*或任何 - 它宁愿审查它作为模式匹配/我的类型本身的元素?因此T []不是[]对T的加法? (什么混淆了我在其他语言的部分,我实际上可以添加一些东西到我的类型:\t '模板使用UniquePtr = std :: unique_ptr ;'将取代我原来的'UniquePtr 'to'std :: unique_ptr '有效地向类型 – barney