通过模板生成排列

时间:2010-07-06 14:31:30

标签: c++ templates permutation

我想要一个函数或函数对象,它可以使用在编译时指定的排列生成其输入的排列。要清楚,我不是要生成所有的排列,只是特定的排列。例如,permute<1,4,3,2>( a, b, c, d )将返回(a,d,c,b)。显然,通过特定长度的排列来实现这一点是直截了当的,例如, 2,像这样

#include <boost/tuple.hpp>
template< unsigned a, unsigned b>
struct permute {
    template< class T >
    boost::tuple< T, T > operator()( T ta, T tb ) {
        boost::tuple< T, T > init = boost::make_tuple( ta, tb );
        return boost::make_tuple( init.get< a >(), init.get< b >() );
    }
};

但是,我将如何为任意长度的排列做这件事?还有,编写上述代码有更简洁的方法吗?是的,上面的代码并不局限于允许permute<2,2>(a,b)允许排列,但我不认为这是一个缺陷。但是,它是否可以仅限于允许实际排列?

1 个答案:

答案 0 :(得分:0)

C ++ 0x提供可变参数模板,您应该可以使用它来处理任意长度的排列。它们是专门添加的,因为当前版本的C ++没有一种干净的方法来处理这类问题。