Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import std.stdio;
- struct Wrapper(O, string getter, string setter) {
- auto get() {
- mixin("return obj."~getter~";");
- }
- Wrapper opAssign(T)(T value) {
- mixin("obj."~setter~"(value);");
- return this;
- }
- Wrapper opOpAssign(string op, T)(T value) {
- mixin("obj."~setter~"(obj."~getter~op~"value);");
- return this;
- }
- private O* obj;
- alias get this;
- }
- mixin template InjectWrapper(string name, string getter, string setter)
- {
- mixin(
- "@property auto "~name~"(this T)() {"~
- " return Wrapper!(T, getter, setter)(&this);"~
- "}");
- mixin(
- "@property auto "~name~"(this T, U)(U value) {"~
- " return Wrapper!(T, getter, setter)(&this) = value;"~
- "}");
- }
- struct Foo {
- mixin InjectWrapper!("value","getValue", "setValue");
- private:
- int value_;
- int getValue() const {
- return value_;
- }
- void setValue(int value) {
- value_ = value;
- }
- }
- int main(string[] args) {
- Foo foo;
- foo.value = 20;
- writeln(foo.value_);
- foo.value += 15;
- writeln(foo.value_);
- foo.value--;
- writeln(foo.value_);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement