gpt4 book ai didi

C++编译时检查函数参数

转载 作者:可可西里 更新时间:2023-11-01 17:41:23 28 4
gpt4 key购买 nike

我正在寻找一种在编译时检查函数参数的方法,如果它可以为编译器做的话。

更具体地说:假设我们有一些矩阵类。

class Matrix
{
int x_size;
int y_size;

public:
Matrix(int width, int height):
x_size{width},
y_size{height}
{}
Matrix():
Matrix(0, 0)
{}
};

int main()
{
Matrix a; // good.
Matrix b(1, 10); // good.
Matrix c(0, 4); // bad, I want compilation error here.
}

那么,如果将静态(源代码编码)值传递给函数,我是否可以检查或区分行为(函数重载?)?

如果值不是静态的:

std::cin >> size;
Matrix d(size, size);

我们只能进行运行时检查。但是,如果值是在源代码中编码的呢?我可以在这种情况下进行编译时检查吗?

编辑:我认为这可以通过 constexpr constructor 实现, 但无论如何都不允许使用和不使用 constexpr 进行重载。所以问题无法以我想的方式解决。

最佳答案

要获得编译时错误,您需要一个模板:

template <int width, int height>
class MatrixTemplate : public Matrix
{
static_assert(0 < width, "Invalid Width");
static_assert(0 < height, "Invalid Height");
public:
MatrixTemplate()
: Matrix(width, height)
{}
};

(顺便说一句:我建议索引使用无符号类型)

如果你没有static_assert(这里我切换成unsigned):

template <unsigned width, unsigned height>
class MatrixTemplate : public Matrix
{
public:
MatrixTemplate()
: Matrix(width, height)
{}
};

template <> class MatrixTemplate<0, 0> {};
template <unsigned height> class MatrixTemplate<0, height> {};
template <unsigned width> class MatrixTemplate<width, 0> {};

这里不支持空矩阵(MatrixTemplate<0, 0>)。但是调整static_asserts或class MatrixTemplate<0应该是一件容易的事。 0>.

关于C++编译时检查函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18981752/

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