2015-04-04 70 views
1

在我的矩陣類有遍歷矩陣元素施加可變功能

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)

有沒有辦法做到這一點?還是有更好的方法來做到這一點?
謝謝。

UPDATE 我正在尋找一種通用的方式來做到這一點。因此,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 
+0

一個更有用的方法是在所有的元素提供迭代器。然後你可以使用C++算法,例如'std :: for_each'。 – juanchopanza 2015-04-04 14:28:50

+0

_「有什麼辦法可以做到這一點嗎?」_你只是寫了那個代碼。或者它不適合你? – 2015-04-04 14:29:36

+0

@ juanchopanza謝謝。我會嘗試執行它 – nnrales 2015-04-04 14:31:23

回答

0

它看起來像

#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; 
} 
+0

這是什麼類型的參數叫做? - 感謝你 – nnrales 2015-04-04 15:05:46

+0

@nrarales參數可能有任何類型, – 2015-04-04 16:03:00