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 ?
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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>>;
Partager