digitalmars.D.learn - Remove stuff from a template mixin
- Gorge Jingale (11/11) Jul 26 2016 Is there a way to remove functions and fields that a mixin
- Gorge Jingale (3/3) Jul 26 2016 I might want to actually use Add internally in B so I can add
- Jerry (17/20) Jul 26 2016 There are no way to remove things from an template directly. But
- Gorge Jingale (5/25) Jul 26 2016 That seems like a lot of work just to remove some elements.
Is there a way to remove functions and fields that a mixin template adds? I use mixin templates to create other types contents, like struct A { mixin Stuff(); } But Sometimes I only want some of the stuff. struct B { mixin Stuff(); disable Add(); } B is like an A but doesn't have the ability to add. While I could do something like move the Add function to another template, it gets messy quickly because all I want to do is remove a feature, not create a hierarchical system like oop. I tried making add private, but b.Add() still calls Stuff.Add.
Jul 26 2016
I might want to actually use Add internally in B so I can add some elements behind the scenes, I do not want to expose it to the outside world though.
Jul 26 2016
On Tuesday, 26 July 2016 at 19:02:32 UTC, Gorge Jingale wrote:I might want to actually use Add internally in B so I can add some elements behind the scenes, I do not want to expose it to the outside world though.There are no way to remove things from an template directly. But you could however generate a new type which does not carry the specified members. This requires two steps: *The member filtering part *Generation part For the masking part take a look at https://forum.dlang.org/post/nn8gj8$6s5$1 digitalmars.com What you basicly do is that you iterate the members and based on some condition filters out the members you don't want. Then for generating you have to handle functions and fields. For fields a string concatenated with other strings fields is probably good enough. Something like this: "typeof(" ~ fullyQualifiedName!Aggregate ~ "." ~ memberName ~ ") " ~ member;"
Jul 26 2016
On Tuesday, 26 July 2016 at 22:23:37 UTC, Jerry wrote:On Tuesday, 26 July 2016 at 19:02:32 UTC, Gorge Jingale wrote:That seems like a lot of work just to remove some elements. Creating a whole new template. I think using additive composition would be easier and more directly(a few lines of code to split the template), and I guess is the more natural way.I might want to actually use Add internally in B so I can add some elements behind the scenes, I do not want to expose it to the outside world though.There are no way to remove things from an template directly. But you could however generate a new type which does not carry the specified members. This requires two steps: *The member filtering part *Generation part For the masking part take a look at https://forum.dlang.org/post/nn8gj8$6s5$1 digitalmars.com What you basicly do is that you iterate the members and based on some condition filters out the members you don't want. Then for generating you have to handle functions and fields. For fields a string concatenated with other strings fields is probably good enough. Something like this: "typeof(" ~ fullyQualifiedName!Aggregate ~ "." ~ memberName ~ ") " ~ member;"
Jul 26 2016