2012-01-29 53 views
0

我想使用編譯時遞歸來輸出一個網格的元素。這主要是爲了試圖熟悉這種技術的作用。使用編譯時遞歸來輸出一個網格

作爲一個例子,我試圖輸出一個網格(矢量>)的值。以下是我迄今爲止:

#include <iostream> 
#include <vector> 

#include <boost/utility/enable_if.hpp> 

typedef std::vector<std::vector<int> > GridType; 

template <std::size_t GridDimensions> 
struct TestClass 
{ 
    template <std::size_t Dim> 
    typename boost::enable_if_c< (GridDimensions == Dim), 
    void >::type loop(GridType& grid) { }; 

    template <std::size_t Dim> 
    typename boost::disable_if_c< (GridDimensions == Dim), 
    void >::type loop(GridType& grid) 
    { 
    for(std::size_t i = 0; i < grid.size(); ++i) 
    { 
     // loop in the nested dimension: 
     loop< Dim + 1 >(grid); 
    }; 

    }; // end loop() 

}; // end TestClass 

int main(int argc, char *argv[]) 
{ 
    std::vector<std::vector<int> > values; 
    for(unsigned int i = 0; i < 10; ++i) 
    { 
    std::vector<int> vec; 
    for(unsigned int j = 0; j < 5; ++j) 
     { 
     vec.push_back(j); 
     } 
    values.push_back(vec); 
    } 
    TestClass<2> test; 
    test.loop<0>(values); 
    return 0; 
} 

但是,我不知道放在哪裏輸出語句,或者是什麼的內循環迴路()應遍歷(我認爲的大小內部數組?)。

這個想法應該是,你只需要在單個行上實現一個輸出循環,並且該行的代碼將爲網格中的每一行生成,對嗎?

+0

你確定你知道你在做什麼嗎?你不想應用編譯時遞歸來顯示一個在運行時填充的網格?這不像C++元編程的作品。看看SO上的其他問題,例如http://stackoverflow.com/q/5274149/106688 – Andrey 2012-01-30 01:36:12

回答

0

這就是我認爲你正在試圖做的:

#include <iostream> 
#include <vector> 

#include <boost/utility/enable_if.hpp> 

typedef std::vector<std::vector<int> > GridType; 

template <std::size_t GD> 
struct TestClass 
{ 
    template<typename GT> 
    static void render(GT& grid) 
    { 
     for(std::size_t i = 0; i < grid.size(); ++i) 
     { 
      // loop in the nested dimension: 
      TestClass<GD - 1>::render(grid[i]); 
     }; 

    }; 

}; // end TestClass 

template <> 
struct TestClass<0> 
{ 
    template<typename GT> 
    static void render(GT& grid) 
    { 
     for(std::size_t i = 0; i < grid.size(); ++i) 
     { 
      std::cout << i << " : " << grid[i] << std::endl; 
     }; 

    }; 

}; // end TestClass 

int main(int argc, char *argv[]) 
{ 
    std::vector<std::vector<int> > values; 
    for(unsigned int i = 0; i < 10; ++i) 
    { 
     std::vector<int> vec; 
     for(unsigned int j = 0; j < 5; ++j) 
     { 
      vec.push_back(10 * j + i); 
     } 
     values.push_back(vec); 
    } 

    TestClass<1>::render(values); 

    return 0; 
} 

它有助於這種類型的TMP的制定出的非模板代碼可能是什麼樣子第一。