【问题标题】:Generating permutations via templates通过模板生成排列
【发布时间】:2010-07-06 22:56:19
【问题描述】:

我想要一个函数或函数对象,它可以根据编译时指定的排列生成其输入的排列。需要明确的是,我并不是要生成所有排列,而是要生成一个特定的排列。例如,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&lt;2,2&gt;(a,b) 是允许的,但我不认为这是一个缺陷。但是,是否可以限制为只允许实际排列?

【问题讨论】:

  • 显然, boost::fusion 从 v 1.41 开始就以nview 的形式拥有它。因为,我使用的是 v. 1.39,所以我没有注意到 ...

标签: c++ templates permutation


【解决方案1】:

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

【讨论】:

  • 你说的完全正确,考虑到我在发帖之前就知道他们,我想我一开始就不应该问。但是,既然你回答了,你就得到了功劳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多