【发布时间】:2017-06-18 09:50:43
【问题描述】:
我在https://stackoverflow.com/a/36132696/3206356 中找到了一个代码,我试了一下。它有效,但我不完全理解那里发生了什么。
我从下面的链接中复制了代码:
template <size_t N, class = std::make_index_sequence<N>>
class Vector;
template <size_t N, size_t... Is>
class Vector<N, std::index_sequence<Is...>>
{
private:
std::array<double, N> vals;
template <size_t >
using double_ = double;
public:
Vector(double_<Is>... vals)
{
...
}
};
例如,我们尝试下一个方式使用它:
Vector<3> a(1.0, 2.0, 3.0);
类型推导在这里如何运作?
附言
据我了解,当编译器看到该行时,首先,它会尝试推断类型以进行专门化。它将N 推断为 3,Is 推断为空序列,然后在找不到合适的构造函数时失败。通用模板没有定义,所以编译器在这里也必须失败。但接下来会发生什么?
【问题讨论】:
-
不,它将 N 推导出为 3,然后将第二个参数推导出为
std::make_index_sequence<3>,因为这是默认模板参数所说的。Is...永远不能是空序列(除非N是0)。 -
但是来自通用模板的
N和来自专业化的N是不同的。当我写到N被推断为3时,我的意思是专业化。据我了解,当我们推断专业化类型时,我们对std::make_index_sequence<N>一无所知。我错了吗? -
它是这样工作的。编译器看到
Vector<3>。它进入主模板,推导出它可以的参数,并填充具有默认值的参数。这会将Vector<3>变成Vector<3, std::make_index_sequence<3>>。 然后为此实例化找到合适的特化并再次推导参数。 -
我现在明白了!谢谢! =)