我正在尝试使用编译时递归来输出网格的元素。这主要是为了尝试熟悉这种技术可以做什么。
作为示例,我试图输出网格的值(向量>)。以下是我到目前为止的情况:
#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循环应该循环(我认为内部数组的大小?)。
这个想法应该是你只需要在一行上实现一个输出循环,并且会为网格中的每一行生成该行的代码,对吗?
答案 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有助于计算非模板化代码的外观。