Comment appeler une fonction sur un object en lui passant un élement d'un tuple ?
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:
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:
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.