gpt4 book ai didi

c++ - 具有取决于整数模板的参数的构造函数的模板参数推导技巧

转载 作者:太空狗 更新时间:2023-10-29 22:57:20 24 4
gpt4 key购买 nike

我在 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 推导为空序列,然后在找不到合适的构造函数时失败。未定义通用模板,因此编译器也必须在这里失败。但接下来会发生什么?

最佳答案

这部分声明(不是定义)模板类 Vector 的默认特化。第二个模板参数默认为索引序列 0...N-1

template <size_t N, class = std::make_index_sequence<N>>
class Vector;

默认参数很重要,因为它提供了一个简单的界面并隐藏了下一个特化的复杂性......

这个特化是作为上述默认声明的结果实例化的。索引序列的目的是携带Is的可变序列(即 0 ... N -1)。

template <size_t N, size_t... Is>
class Vector<N, std::index_sequence<Is...>>
{

定义足够的存储空间

private:
std::array<double, N> vals;

提供了一种翻译序列 Is 的方法从 size_t 到类型(在本例中为 double)

    template <size_t >
using double_ = double;

public:

定义构造函数来取 double_<0> , double_<1> ... double_<N-1> .但是double<N>对于任何 Ndouble 的类型定义.所以这条线所做的是提供一个构造函数,它需要一个 double对于每个 Is .即构建数组所需的 double 。它实际上非常聪明。

    Vector(double_<Is>... vals)
{
...
}
};

关于c++ - 具有取决于整数模板的参数的构造函数的模板参数推导技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44613761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com