循环应用变量函数的矩阵元素
Loop over matrix elements applying variable function
在我的矩阵 class 中
的实例太多
for(size_t i = 1 ; i <= rows ; i++){
for(size_t j = 1 ; i <= cols ;j++){
//Do something
}
}
牢记 DRY 原则,我想知道我是否可以
matrix<T>::loopApply(T (*fn) (T a)){ // changed T to T a
for(size_t i = 1 ; i <= rows ; i++){
for(size_t j = 1 ; i <= cols ;j++){
_matrix[(i-1)*_rows + (j-1)] = fn(a) // changed T to a
}
}
}
所以当我想循环并将某些东西应用到矩阵时,我只需要调用 loopApply(fn)
有什么办法吗?还是有更好的方法来做到这一点?
谢谢你。
更新
我正在寻找一种通用的方法来做到这一点。这样 fn 就不必采用单个参数等。我听说过可变参数,但我不明白它们是如何工作的,或者它们是否适合这项工作。
最小代码:
// in matrix.h
template <class T>
class matrix
{
public:
...
private:
...
std::vector<T> _matrix;
void loopApply(T (*fn) (T) );
}
#include "matrix.tpp"
//in matrix.tpp
template <class T> // Template to template // Pointed out in comment
// loopApply as written above
看起来像
#include <iostream>
struct A
{
enum { N = 10 };
int a[N][N];
template <typename Fn, typename ...Args>
void method( Fn fn, Args...args )
{
for ( size_t i = 0; i < N; i++ )
{
for ( size_t j = 0; j < N; j++ ) a[i][j] = fn( args... );
}
}
};
int main()
{
return 0;
}
在我的矩阵 class 中
的实例太多for(size_t i = 1 ; i <= rows ; i++){
for(size_t j = 1 ; i <= cols ;j++){
//Do something
}
}
牢记 DRY 原则,我想知道我是否可以
matrix<T>::loopApply(T (*fn) (T a)){ // changed T to T a
for(size_t i = 1 ; i <= rows ; i++){
for(size_t j = 1 ; i <= cols ;j++){
_matrix[(i-1)*_rows + (j-1)] = fn(a) // changed T to a
}
}
}
所以当我想循环并将某些东西应用到矩阵时,我只需要调用 loopApply(fn)
有什么办法吗?还是有更好的方法来做到这一点?
谢谢你。
更新 我正在寻找一种通用的方法来做到这一点。这样 fn 就不必采用单个参数等。我听说过可变参数,但我不明白它们是如何工作的,或者它们是否适合这项工作。
最小代码:
// in matrix.h
template <class T>
class matrix
{
public:
...
private:
...
std::vector<T> _matrix;
void loopApply(T (*fn) (T) );
}
#include "matrix.tpp"
//in matrix.tpp
template <class T> // Template to template // Pointed out in comment
// loopApply as written above
看起来像
#include <iostream>
struct A
{
enum { N = 10 };
int a[N][N];
template <typename Fn, typename ...Args>
void method( Fn fn, Args...args )
{
for ( size_t i = 0; i < N; i++ )
{
for ( size_t j = 0; j < N; j++ ) a[i][j] = fn( args... );
}
}
};
int main()
{
return 0;
}