Template with template?
John Colvin
john.loughran.colvin at gmail.com
Thu Mar 20 11:54:28 PDT 2014
On Thursday, 20 March 2014 at 18:39:32 UTC, Chris wrote:
> On Thursday, 20 March 2014 at 17:49:52 UTC, John Colvin wrote:
>> On Thursday, 20 March 2014 at 16:40:50 UTC, Chris wrote:
>>> On Thursday, 20 March 2014 at 16:32:34 UTC, Vladimir
>>> Panteleev wrote:
>>>> On Thursday, 20 March 2014 at 16:28:46 UTC, Chris wrote:
>>>>> How can I instantiate Person with Trait, i.e. a template
>>>>> with a template?
>>>>>
>>>>> struct Trait(T0, T1) {
>>>>> T0 name;
>>>>> T1 value;
>>>>> T1[T0] map;
>>>>>
>>>>> this(T0 name, T1 value) {
>>>>> this.name = name;
>>>>> this.value = value;
>>>>> map[name] = value;
>>>>> }
>>>>> }
>>>>>
>>>>> class Person(T) {
>>>>> T traits[];
>>>>>
>>>>> void addTrait(T trait) {
>>>>> traits ~= trait;
>>>>> }
>>>>> }
>>>>>
>>>>>
>>>>> void main()
>>>>> {
>>>>> auto trait1 = Trait!(string, string)("Name", "John");
>>>>> auto trait2 = Trait!(string, int)("Age", 42);
>>>>> writefln(%s", trait1.map);
>>>>> writefln(%s", trait2.map);
>>>>> // above code compiles and works
>>>>> }
>>>>
>>>> Person!(Trait!(string, string)) person;
>>>>
>>>> -- or --
>>>>
>>>> alias MyTrait = Trait!(string, string);
>>>> Person!MyTrait person;
>>>>
>>>> Note that this approach won't let you have traits with
>>>> different parameters within the same Person type.
>>>
>>> Yep, I've already tried this (sorry I should've mentioned
>>> it!). But I don't want this restriction.
>>
>> Arrays are homogeneous. All the elements must be of the same
>> type. Different instantiations of templates are different
>> types.
>>
>> You could use an array of std.variant.Variant
>
> The elements are all of type Trait. However, Type itself might
> be
> of different types. That's why it is not possible? I've come
> across this restriction before when using templates, which is a
> big disappointment because it restricts the "templatization" /
> generalization of data structures somewhat.
Trait is not a type. Trait is a template. An instantiation of the
Trait template is a type.
Arrays are contiguous, homogeneous data. This is fundamental to
their design and their performance characteristics.
Workarounds use at least one of the following: indirection,
tagging* and padding. Variant uses tagging and padding.
Interface/base-class arrays use indirection (and tagging,
ultimately).
*inline or external, or even compile-time.
This is true in *every* programming language, just with different
names.
More information about the Digitalmars-d-learn
mailing list