Генерация перестановок с помощью шаблонов

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


person rcollyer    schedule 06.07.2010    source источник
comment
по-видимому, boost::fusion имеет его с версии 1.41 в виде nview. Поскольку я использовал версию 1.39, я не заметил ...   -  person rcollyer    schedule 01.04.2011


Ответы (1)


C++0x предоставляет шаблоны с переменным числом аргументов, которые вы сможете использовать для обработки перестановок произвольной длины. Они были добавлены специально, потому что текущая версия C++ не имеет четкого способа решения такого рода проблем.

person Jerry Coffin    schedule 06.07.2010
comment
Вы абсолютно правы, и, учитывая, что я знал о них до публикации, думаю, мне вообще не следовало спрашивать. Но, поскольку вы ответили, вы получаете кредит. - person rcollyer; 06.07.2010