Мне нужна функция или функциональный объект, который может генерировать перестановку своих входных данных с перестановкой, указанной во время компиляции. Чтобы было ясно, я не собираюсь генерировать все перестановки, только конкретную. Например, 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)
разрешен, но я не вижу в этом недостатка. Однако можно ли ограничиться разрешением только реальных перестановок?