Генерация перестановок с помощью шаблонов - PullRequest
0 голосов
/ 06 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...