【问题标题】:How does compiler choose between template specializations featuring an array?编译器如何在具有数组的模板特化之间进行选择?
【发布时间】:2009-10-22 10:21:52
【问题描述】:

我刚刚遇到了 std::tr1::extent 模板,这让我很困惑。我一生中从未处理过数组类型参数,所以我不明白它们是如何工作的。所以,给定来自 gcc type_traits

的代码
template<typename _Tp, unsigned _Uint, std::size_t _Size>
     struct extent<_Tp[_Size], _Uint>

template<typename _Tp, unsigned _Uint>
     struct extent<_Tp[], _Uint>

编译器如何在这些特化之间进行选择?我应该将什么类型传递给extent 让它选择第二个?

【问题讨论】:

    标签: c++ arrays templates tr1


    【解决方案1】:
    extent<int[], 0>::value == 0 // second one chosen
    

    int[] 是一个不完整的类型,编译器不知道它的sizeof 值。最外层维度可能保持不完整,因为数组在大多数情况下正常运行并不重要(特别是索引仍然有效)。像int[1][] 这样的东西将不再是正确的类型。

    extent<int[2], 0>::value == 2 // first one chosen
    

    当然可以嵌套:

    extent<int[][2], 0>::value == 0 // second one chosen, with `_Tp` being `int[2]`
    extent<int[][2], 1>::value == 2 // second one chosen again
    

    【讨论】:

    • 所以只要声明中有空方括号 ([]),就会选择第二个?
    • 是的,确实如此。那是因为T[] 不匹配T[N]
    • 嗯,尽管符合逻辑,但当extent&lt;_Tp[_Size], _UInt&gt; 匹配extent&lt;int[1][2]&gt; 时,_Tp 得到int[2] 而不是int[1]。但是(int [1])[2] 似乎更直观...
    • 您必须将其视为“_Size _Tp 数组”,而不是纯文本替换。实际规则更复杂。规则是在T d; 中,如果dd1[N],并且T d1; 的类型是X T,那么d 的类型是X array of N T。将其应用于int i[1];dd1[1]int i; 的类型为“int”(X 为空,T 为 int),d 的类型为array of 1 int。而申请int i[1][2];d就是d1[2]int i[1]; 的类型是 array of 1 int,所以 Xarray of 1。整体类型为X array of 2 int = array of 1 array of 2 int
    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多