Overloading property vs. non-property
torhu
no at spam.invalid
Thu Jul 15 18:27:06 PDT 2010
On 16.07.2010 01:46, BCS wrote:
> Hello dsimcha,
>
>> Histogram(someData, 10)
>> .barColor(getColor(255, 0, 0))
>> .histType(HistType.Probability)
>> .toFigure.title("A Histogram")
>> .xLabel("Stuff").showAsMain();
>
> With a little meta programming you might be able to make a type that generate
> a fluent interface for any type. Using opDispatch you pass the args into
> a contained type and return self. The only difference from the users standpoint
> is that you need one more function call in the chain.
>
Great idea. I figured a fancy solution wouldn't be worth it, but if it
could be fully generic...
---
import std.stdio;
class Foo {
int a;
string b;
@property int propA(int v) { return a = v; }
@property int propA() { return a; }
@property string propB(string v) { return b = v; }
@property string propB() { return b; }
void foo() { writeln("foo"); }
}
struct PSet(T)
{
T _obj;
typeof(this) opDispatch(string prop, T...)(T val)
{
mixin("_obj." ~ prop ~ "=val;");
return this;
}
}
PSet!T pset(T)(T obj)
{
return PSet!T(obj);
}
void main()
{
Foo f = new Foo;
// Not sure why putting those foo()'s in there just like that works.
// compiler bug?
pset(f).propA(1).foo().propB("something").foo();
assert(f.a == 1);
assert(f.b == "something");
}
---
More information about the Digitalmars-d
mailing list