gpt4 book ai didi

c++ - 模板参数比较为假时调用的 if 语句

转载 作者:行者123 更新时间:2023-11-28 05:00:02 28 4
gpt4 key购买 nike

我正在使用 C++14 编写模板化矩阵类。这个类有三个模板参数:存储的数据类型(dtype)、行数(N)和列数(M)。

类签名是

template<class dtype, size_t N, size_t M>
class Matrix

我编写了一个行列式成员函数,它在模板参数具有特定值时调用特定情况。例如,当行数为 1 时,它返回矩阵本身的拷贝。或者,当行数为 2 或 3 时,它返回具有行列式的相同数据类型的 1x1 矩阵。最后,当行数大于3时,它使用递归方法根据行列式的余因子展开计算行列式。

我这样做是为了更好地学习 C++14,所以我非常感谢您的帮助。

导致问题的代码片段就是这部分:

Matrix<dtype, 1, 1> det() const {
if (N != M || N >= 12) {
return Matrix<dtype, 1, 1>();
} else if (N == 1) {
return this->copy();
} else if (N == 2) {
return Matrix<dtype, 1, 1>(this->get(0, 0) * this->get(1, 1) - this->get(0, 1) * this->get(1, 0));
} else if (N == 3) {
return Matrix<dtype, 1, 1>(
this->get(0, 0) * (this->get(1, 1) * this->get(2, 2) - this->get(1, 2) * this->get(2, 1)) -
this->get(0, 1) * (this->get(1, 0) * this->get(2, 2) - this->get(1, 2) * this->get(2, 0)) +
this->get(0, 2) * (this->get(1, 0) * this->get(2, 1) - this->get(1, 1) * this->get(2, 0)));
} else if (N < 12) {
Matrix<dtype, 1, 1> determinant;
Matrix<dtype, N - 1, N - 1> sub_matrix;
for (size_t i = 0; i < N; ++i) {
sub_matrix = this->drop_cross(i, i);
Matrix<dtype, 1, 1> sub_det(sub_matrix.det());
if (i % 2 == 0) determinant = determinant + (this->get(0, i) * sub_det);
else if (i % 2 == 1) determinant = determinant - (this->get(0, i) * sub_det);
}
return determinant;
}
}

此函数由以下代码调用:

#include "lin_alg_classes.h"

int main() {
Matrix<double, 3, 3> test3(1.0, true);

std::cout << std::endl;
std::cout << test3.det();

return 0;
}

并给出以下输出:

In file included from C:\Users\ekin4\CLionProjects\mt_grav\main.cpp:5:0:
C:\Users\ekin4\CLionProjects\mt_grav\lin_alg_classes.h: In instantiation of 'Matrix<dtype, 1ull, 1ull> Matrix<dtype, N, M>::det() const [with dtype = double; long long unsigned int N = 3ull; long long unsigned int M = 3ull]':
C:\Users\ekin4\CLionProjects\mt_grav\main.cpp:29:28: required from here
C:\Users\ekin4\CLionProjects\mt_grav\lin_alg_classes.h:132:31: error: could not convert 'Matrix<dtype, N, M>::copy<double, 3ull, 3ull>()' from 'Matrix<double, 3ull, 3ull>' to 'Matrix<double, 1ull, 1ull>'
return this->copy();

我不明白的是为什么它在应该调用 N < 12 的情况下调用 N = 1 的情况。我已经检查了大括号、圆括号和分号,它们都是正确的,但对于我的生活,我不明白发生了什么。

最佳答案

Pre c++17 ( if constexpr ) 您可以使用 SFINAE 并启用/禁用不同版本的 det()根据 N 的值和 M .

类似(抱歉:未测试)

template <std::size_t A = N, std::size_t B = M>
std::enable_if_t<(A != B) || (A > 11U), Matrix<dtype, 1, 1>> det() const
{ return Matrix<dtype, 1, 1>(); }

template <std::size_t A = N, std::size_t B = M>
std::enable_if_t<(A == B) && (A == 1U), Matrix<dtype, 1, 1>> det() const
{ return this->copy(); }

// other cases

关于c++ - 模板参数比较为假时调用的 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46268269/

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