conversion d'un prédicat binaire en prédicat unaire
Bonjour,
Je voudrais créer un outil générique de conversion d'un prédicat binaire en prédicat unaire (en fixant un des paramètres)
mais je n'arrive pas à trouver une syntaxe éléguante et universelle, si elle existe. Quelqu'un a une idée d'amélioration ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| /* Solution actuelle (fonctionne partiellement) */
/* Helper class : fonctionne mais syntaxe lourde */
template <template <class, class> BinaryPredicate, class FirstArg>
class FixFirstArgGenerator
{
public:
template <class T>
using Result = BinaryPredicate<FirstArg, T>;
};
/* Syntaxe plus légère mais ne fonctionne pas dans tous les cas */
template <class T>
template <template <class, class> BinaryPredicate, class FirstArg>
using FixFirstArg = typename FixFirstArgGenerator<BinaryPredicate,
FirstArg>:: template Result<T>;
/* Exemples d'utilisation */
template <class T, class U>
using MyBinaryPredicate = int;
template <class T>
using MyUnaryPredicate = unsigned int;
template <template <class, class> class BinaryPredicate>
class MyClassUsingBinaryPredicate {};
template <template <class> class UnaryPredicate>
class MyClassUsingUnaryPredicate {};
using A = MyClassUsingBinaryPredicate<MyBinaryPredicate>;
using B = MyClassUsingUnaryPredicate<MyUnaryPredicate>;
/* Conversions du prédicat binaire en prédicat unaire (en fixant
le premier argument à long) puis utilisation du résultat comme
argument */
/* Solution en 2 lignes avec utilisation de FixFirstArg => OK */
template <class T>
using MyUnaryPredicateFromBinaryPredicate = FixFirstArg<MyBinaryPredicate, long>;
using C = MyClassUsingUnaryPredicate<MyUnaryPredicateFromBinaryPredicate>;
/* Solution en 1 ligne avec utilisation de FixFirstArgGenerator => OK */
using D = MyClassUsingUnaryPredicate<FixFirstArgGenerator<MyBinaryPredicate, long>::Result>;
/* Solution en 1 ligne avec utilisation de FixFirstArg => Ne compile pas (gcc) */
//using E = MyClassUsingUnaryPredicate<FixFirstArg<MyBinaryPredicate, long>>; |
Merci