Design: extend the Variant::Visitor (2)

extend to arbitrary return values
This commit is contained in:
Fischlurch 2015-08-29 17:31:42 +02:00
parent 24762eda89
commit 92b779c6b8

View file

@ -58,17 +58,22 @@ using std::string;
using std::cout;
using std::endl;
template<typename RET>
struct VFunc
{
template<class VAL>
struct ValueAcceptInterface
{
virtual void handle(VAL&) { /* NOP */ };
virtual RET handle(VAL&) { /* do nothing */ return RET(); };
};
template<typename TYPES>
using VisitorInterface
= lib::meta::InstantiateForEach<typename TYPES::List, ValueAcceptInterface>;
};
template<class A, class B>
@ -78,15 +83,18 @@ struct Var
B b;
using TYPES = lib::meta::Types<A,B>;
using Visitor = VisitorInterface<TYPES>;
void
accept (Visitor& visitor)
template<typename RET>
using Visitor = typename VFunc<RET>::template VisitorInterface<TYPES>;
template<typename RET>
RET
accept (Visitor<RET>& visitor)
{
ValueAcceptInterface<A>& visA = visitor;
ValueAcceptInterface<B>& visB = visitor;
typename VFunc<RET>::template ValueAcceptInterface<A>& visA = visitor;
typename VFunc<RET>::template ValueAcceptInterface<B>& visB = visitor;
visA.handle (a);
visB.handle (b);
return visB.handle (b);
}
@ -102,7 +110,7 @@ struct Var
class Visi
: public Var<int,string>::Visitor
: public Var<int,string>::Visitor<void>
{
virtual void handle(int& i) { ++i; }
@ -119,7 +127,7 @@ main (int, char**)
cout << string(var)<<endl;
Visi visi;
var.accept(visi);
var.accept<void>(visi);
cout << string(var)<<endl;
cout << "\n.gulp.\n";