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