- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个矩阵类,它是一个模板类:
template <class T, int height, int width>
我想编写成员函数来计算矩阵的行列式。如何在不为方矩阵编写整个单独的模板类的情况下仅为方矩阵声明此函数?
最佳答案
由于您的矩阵类是在 height
上模板化的和 width
,方阵是那些模板参数相等的矩阵。您可以使用相同的 N
轻松地将此类作为参数对于第二个和第三个模板参数:
template <class T, int N>
auto get_det(const Matrix<T, N, N>& mat) -> float;
在您的情况下,这将是最简单的解决方案。但是,您也可以使用 enable_if
来做到这一点,但在这种特定情况下,它是矫枉过正的。但是,您可以将其应用于其他一些更复杂的解决方案:
template <class T, int H, int W>
auto get_det(const Matrix<T, H, W>& mat) -> std::enable_if_t<H == W, float>;
检查 enable_if documentation和 C++ Idioms/enable-if如果你想了解更多关于 SFINAE 和 enable_if
的信息,请出去
如果您想要一个方法,不幸的是,事情并不那么容易。您可以只特化一个类中的一个方法,但不能部分特化它。但是有一个技巧可以解决它:
template <class T, int H, int W>
struct Matrix {
template <int N = H, int M = W>
auto get_det() const -> std::enable_if_t<N == M, float> { return 2.4f; }
};
你可以这样测试:
Matrix<int, 2, 3> not_square;
Matrix<int, 2, 2> square;
// error error: no matching member function for call to 'get_det'
// note: candidate template ignored: disabled by 'enable_if' [with N = 2, M = 3]
//not_square.get_det();
//OK:
square.get_det();
在这里get_det
需要模板化,因为 enbale_if
必须对成员模板参数进行操作。否则,如果它对类模板参数 (enable_if_t<H == W>
) 进行操作,它将禁用整个类,而不仅仅是成员。
一个小缺点是您可以显式特化该方法,从而允许在非方矩阵上调用它。但这是根本不应该做的事情,而且通常不会:
// No compilation error:
not_square.get_det<2,2>();
方法的另一个技巧是使用自由函数:
template <class T, int H, int W>
struct Matrix;
namespace detail {
template <class T, int N>
auto get_det(const Matrix<T, N, N>&) -> float { return 3.5; }
}
template <class T, int H, int W>
struct Matrix {
auto get_det2() const -> float { return detail::get_det(*this); }
};
老实说,我认为这行不通,但 clang 和 gcc 都能正常工作。仍然不能 100% 确定它没问题。有空的时候会调查一下。
关于c++ - 不重写类的部分模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36678847/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!