Can I parametrize template mixin's identifiers?
Nick
nick at example.com
Mon Feb 21 08:40:50 PST 2011
On 2/19/2011 10:46 PM, Lutger Blijdestijn wrote:
> Nick wrote:
>
>> I know I can parametrize template mixin types, but how about mixin
>> identifiers? This is the code:
>>
>> ----------------------------------------------------------------
>>
>> mixin template Box(T) {
>> T val;
>> }
>>
>> class Set(A, B) {
>> mixin Box!A a;
>> mixin Box!B b;
>> }
>>
>> alias Set!(int, int) IntSet;
>>
>> int main(string[] argv) {
>> scope auto s = new IntSet();
>> s.a.val = 3;
>> }
>>
>> ----------------------------------------------------------------
>>
>> As you can see, the A and B types can be changed and with them the boxed
>> values. But they need disambiguation, since they have identically named
>> members. I know only to hard-code that disambiguation.
>>
>> I need this because I intend to change (A, B) with a type list
>> eventually and I need to make operations on the boxed types independent
>> on the template mixin identifiers (a, b).
>>
>> This pattern comes from C++ code, where Box(T) would be classes, Set (A,
>> B, ...) would recursively apply multiple inheritance on the type list.
>> Then each Box members could be addressed by casting to the correct Box(T).
>>
>> Any idea if this is possible in D?
>>
>> Thanks!
>
> Possible yes, but probably not so pretty. There must be some places in
> phobos where something like this is done (better), perhaps in the code for
> tuples in std.typecons. Here is my unpolished attempt:
>
> mixin template Box(T)
> {
> T val;
> }
>
> mixin template MixinFields(P...)
> {
> /* P[0] is the template to use as mixin
> * P[1] is the type to be use as parameter for P[0]
> * P[2] is the symbol name the mixin will be aliased to
> */
> mixin("mixin " ~ __traits(identifier, P[0]) ~ "!(" ~ P[1].stringof ~ ")
> " ~ P[2] ~ ";");
> static if(P.length> 3)
> mixin MixinFields!(P[0], P[3..$]);
> }
>
>
> class Set(T...)
> {
> mixin MixinFields!(Box, T);
> }
>
> alias Set!(int, "a", int, "b") IntSet;
>
> void main()
> {
> scope auto s = new IntSet();
> s.a.val = 3;
> }
Thanks!
I was staying away from string mixins as they seem (although powerful)
rather difficult to grok. But if I must, I must...
More information about the Digitalmars-d-learn
mailing list