diff --git a/research/try.cpp b/research/try.cpp index 4dbbc0b0f..edf81ddc4 100644 --- a/research/try.cpp +++ b/research/try.cpp @@ -48,12 +48,13 @@ typedef unsigned int uint; #include "lib/meta/typelist.hpp" #include "lib/meta/generator.hpp" #include "lib/format-util.hpp" +#include "lib/util.hpp" -//#include #include #include #include +using util::unConst; using std::string; using std::cout; using std::endl; @@ -75,6 +76,25 @@ struct VFunc }; +using lib::meta::NullType; +using lib::meta::Node; + +template +struct ConstAll; + +template<> +struct ConstAll + { + typedef NullType List; + }; + +template +struct ConstAll> + { + typedef Node::List> List; + }; + + template struct Var @@ -85,17 +105,37 @@ struct Var using TYPES = lib::meta::Types; template - using Visitor = typename VFunc::template VisitorInterface; + using VisitorFunc = typename VFunc::template VisitorInterface; + template + using VisitorConstFunc = typename VFunc::template VisitorInterface>; + + using Visitor = VisitorFunc; + using Predicate = VisitorConstFunc; template RET - accept (Visitor& visitor) + accept (VisitorFunc& visitor) { typename VFunc::template ValueAcceptInterface& visA = visitor; typename VFunc::template ValueAcceptInterface& visB = visitor; visA.handle (a); return visB.handle (b); } + + void + accept (Visitor& visitor) + { + accept (visitor); + } + + bool + accept (Predicate& visitor) const + { + typename VFunc::template ValueAcceptInterface& visA = visitor; + typename VFunc::template ValueAcceptInterface& visB = visitor; + return visA.handle (a) + && visB.handle (b); + } operator string() const @@ -109,25 +149,36 @@ struct Var }; +using V = Var; + class Visi - : public Var::Visitor + : public V::Visitor { - - virtual void handle(int& i) { ++i; } - virtual void handle(string& s) { s += ".."; } + virtual void handle(int& i) { ++i; } + virtual void handle(string& s) { s += "."; } + }; + +class Predi + : public V::Predicate + { + virtual bool handle(int const& i) { return 0 == i % 2; } + virtual bool handle(string const& s) { return 0 == s.length() % 2; } }; int main (int, char**) { - using V = Var; - V var{12, "hui"}; + V var{12, "huii"}; cout << string(var)<(visi); + Predi predi; + + cout << var.accept(predi) <