gpt4 book ai didi

c++ - 编译时检查可变参数模板中的参数数量

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:51 24 4
gpt4 key购买 nike

我制作了一个通用的 n 维数组类,但我想通过一些编译时检查使其更安全。

构造函数和 operator() 仅在给定的参数数量等于 dimension 时才能正常工作。尽管如此,如果我编写如下代码

Array<int, 2> a(1, 2, 3); //3 dimensions for a 2d array == crash

Array<int> a(1); //plain 1D array
std::cout << a(1, 2); //segfault

它只是静默编译,我需要运行调试器,但调试可变参数模板非常困惑。

您能想出一种好方法来提供编译时检查与维度匹配的参数的正确数量吗?

template<typename T, int dimension = 1>
class Array
{
private:
std::unique_ptr<T[]> pointer;
int size[dimension];
int realSize;

public:
Array()
{
}

template<typename... Ns>
Array(Ns... ns)
: realSize(1)
{
create(1, ns...);
}

private:
template<typename... Ns>
void create(int d, int n, Ns... ns)
{
realSize *= n;
size[d - 1] = n;
create(d + 1, ns...);
}

void create(int d)
{
pointer = std::unique_ptr<T[]>(new T[realSize]);
}

int computeSubSize(int d) const
{
if (d == dimension)
{
return 1;
}
return size[d] * computeSubSize(d + 1);
}

template<typename... Ns>
int getIndex(int d, int n, Ns... ns) const
{
return n * computeSubSize(d) + getIndex(d + 1, ns...);
}

int getIndex(int d) const
{
return 0;
}

public:
template<typename... Ns>
T& operator()(Ns... ns) const
{
return pointer[getIndex(1, ns...)];
}

int getSize(int d = 1) const
{
return size[d - 1];
}
};

最佳答案

你可以在正确的地方添加编译时断言语句来防止类似的代码

Array<int, 2> a1(1, 2, 3);

Array<int> a3(1);
std::cout << a3(1, 2);

正在编译。

这是曾经的地方:

  template<typename... Ns>
Array(Ns... ns)
: realSize(1)
{
static_assert(sizeof ...(Ns) == dimension, "Incorrect number of arguments");
create(1, ns...);
}

那阻止了这条线

Array<int, 2> a1(1, 2, 3);

正在编译。

另一个地方:

  template<typename... Ns>
T& operator()(Ns... ns) const
{
static_assert(sizeof ...(Ns) == dimension, "Incorrect number of arguments");
return pointer[getIndex(1, ns...)];
}

这样可以防止

Array<int> a3(1);
std::cout << a3(1, 2);

正在编译。

以下是一些有效的陈述:

Array<int, 2> a2(1, 2);

Array<int> a3(1);
std::cout << a3(0);

关于c++ - 编译时检查可变参数模板中的参数数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30950295/

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