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 | 
Partager