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 : 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>>;
Merci