使用编译时递归来输出网格

时间:2012-01-29 22:05:42

标签: c++ templates

我正在尝试使用编译时递归来输出网格的元素。这主要是为了尝试熟悉这种技术可以做什么。

作为示例,我试图输出网格的值(向量>)。以下是我到目前为止的情况:

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

但是,我不确定输出语句的位置,或循环内部的for循环应该循环(我认为内部数组的大小?)。

这个想法应该是你只需要在一行上实现一个输出循环,并且会为网格中的每一行生成该行的代码,对吗?

1 个答案:

答案 0 :(得分: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有助于计算非模板化代码的外观。