Salut,

J'ai fais une classe similaire à boost::variant, et j'utilise une bibliothèque (la bibliothèque multiple dispatch) pour le pattern visitor et la génération automatique de hiérarchie, pour le variant, je recherche l'index du type passé, pour ensuite le passer au foncteur du visiteur, mais, cela ne compile pas.

Code cpp : 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
 
#ifndef VARIANT_HPP
#define VARIANT_HPP
#include "multdispvisitors.hpp"
namespace odfaeg {
    template <class T, class Tuple>
    struct Index;
    template <class T, class... Types>
    struct Index<T, std::tuple<T, Types...>> {
        static const std::size_t value = 0;
    };
 
    template <class T, class U, class... Types>
    struct Index<T, std::tuple<U, Types...>> {
        static const std::size_t value = 1 + Index<T, std::tuple<Types...>>::value;
    };
    template <typename... T>
    class Family : T... {
    };
    template <typename... T>
    class Visitable : accept_visitor<Family<T...>, T...> {
    };
    template <typename... T>
    class Variant : acceptable<Family<T...>, T>... {
    public :
        template <typename V>
        Variant (V value) {
            std::get<V>(tuple) = value;
            index = Index<V, decltype(tuple)>::value;
        }
        template <typename A>
        void apply_visitor() const {
             A action();
             action.apply(std::get<index>(tuple));
        }
    private :
        std::tuple<T...> tuple;
        std::size_t index;
    };
    template <typename A, typename... T>
    class Visitor : dispatchable<A, Family<T...>> {
 
    };
}
#endif

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
/usr/local/include/odfaeg/Core/variant.h|33|error: use of ‘this’ in a constant expression|
Comment dois je passer cela au foncteur à mon visiteur ?

Merci d'avance.

PS : Le visiteur doit hériter de Visitor et prend en paramètre template le nom de la classe qui sert de visiteur, ainsi que les types du variant.
Et là dedans je déclare tout les foncteurs pour tout les types du variant.