Variant is just a class
    Josphe Brigmo 
    JospheBrigmo at gmail.com
       
    Sat Sep  8 02:09:32 UTC 2018
    
    
  
Here is a working example:
import std.stdio;
class Project(Wrapped, Interface) : Interface
{
	import std.traits;
	Wrapped wrapped;
	static foreach (member; __traits(allMembers, Interface))
	{
		static foreach (overload; __traits(getOverloads, Interface, 
member))
		{			
			mixin(`ReturnType!overload ` ~ member ~ `(Parameters!overload 
params) { return wrapped.` ~ member ~ `(params); }`);
		}
	}
	//this(Wrapped w)
	static Interface opCall(Wrapped w)
	{
		auto t = new typeof(this);
		t.wrapped = w;
		return t;
	}
}
interface I
{
     void foo();
}
class A
{
     void foo() { writeln("A"); }
}
class B
{
     void foo() { writeln("B"); }
}
void main()
{
	auto b = new B();
	auto a = new A();
	auto x = Project!(A, I)(a);
	auto y = Project!(B, I)(b);
	a.foo();
	b.foo();
	x.foo();
	y.foo();
}
    
    
More information about the Digitalmars-d
mailing list