전 처리 단계에서이 작업을 수행 할 수있는 Boost.Preprocessor에는 BOOST_PP_SEQ_FOR_EACH_PRODUCT
이 있습니다.
BOOST_PP_SEQ_FOR_EACH_PRODUCT 매크로는 여러 seq의 각 데카르트 곱을위한 매크로를 반복합니다.
그러나 나는 그것이 당신이 찾고있는 것이 아닌 것으로 생각합니다.
약간의 재사용 가능한 코드가 정상이면 Boost.Iterator에 Function Input Iterator을 사용하여 주어진 범위의 데카르트 곱을 생성 할 수 있습니다.
발전기
class product_generator
{
public:
typedef std::vector<int> result_type;
product_generator (int lower, int upper, unsigned int repeat)
: m_lower(lower), m_upper(upper)
{
for(unsigned int i = 0; i < repeat; ++i)
{
m_iters.push_back(m_lower);
}
};
std::vector<int> operator()()
{
for(int& i : m_iters)
{
if(++i >= m_upper)
i = m_lower;
else
break;
}
std::vector<int> res;
for(int i : m_iters)
res.push_back(i);
return res;
};
private:
int m_lower;
int m_upper;
std::vector<int> m_iters;
};
이 생성기를 사용, 당신은 같은 것을 수행 할 수 있습니다
product_generator p(lower, upper, repeat);
auto bgn = boost::make_function_input_iterator(p, (double)0);
bgn
하면 루프를 통해 형성 입력 시퀀스의 직교 제품을 생성 할 수있는 하나의 반복자입니다 입력 범위에 따라.
완전한 작동 예 :
#include <vector>
#include <iostream>
#include <boost/iterator/function_input_iterator.hpp>
#include <math.h>
int main()
{
int lower = 1;
int upper = 4;
unsigned int repeat = 3;
product_generator p(lower, upper, repeat);
for(
auto bgn = boost::make_function_input_iterator(p, (double)0);
bgn != boost::make_function_input_iterator(p, pow(upper-lower, repeat));
++bgn
)
{
for(int i : *bgn)
{
std::cout << i << " ";
}
std::cout << std::endl;
}
}