March 03, 2011 Re: Parameterized Structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to Peter Lundgren | On 03/03/2011 05:56 AM, Peter Lundgren wrote: > Where can I go to learn about parameterized structs? I can't seem to find any > literature on the subject. In particular, what are you allowed to use as a > parameter? I would like to define a struct like so: > > struct MyStruct(T, T[] a) { > ... > } > > but I receive the following error: > > Error: arithmetic/string type expected for value-parameter, not T[] > > Are arrays not allowed? Aside the error, I find this a bit strange. Do you really mean that /both/ a type T and an element of type T[] are /template/ parameters? Would you show your case? I expect (but may be wrong, indeed) something like this: struct MyStruct(T) { T[] a; ... } or maybe: struct MyStruct(T) { static T[] a = [...]; ... } Denis -- _________________ vita es estrany spir.wikidot.com |
March 03, 2011 Re: Parameterized Structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to Bekenn | On Thu, 03 Mar 2011 00:45:05 -0500, Bekenn <leaveme@alone.com> wrote:
> On 3/2/2011 8:56 PM, Peter Lundgren wrote:
>> Where can I go to learn about parameterized structs? I can't seem to find any
>> literature on the subject. In particular, what are you allowed to use as a
>> parameter? I would like to define a struct like so:
>>
>> struct MyStruct(T, T[] a) {
>> ...
>> }
>>
>> but I receive the following error:
>>
>> Error: arithmetic/string type expected for value-parameter, not T[]
>>
>> Are arrays not allowed?
>
> This compiles:
>
> struct MyStruct(T : T[], T a)
> {
> T A = a.dup;
> }
>
> ...but I have yet to figure out how to properly invoke it.
warning to all template novices -- a template compiling simply means it *PARSES*. You have to instantiate it, in order to verify it is correct. The compiler cannot possibly know the semantic meaning of a template without knowing what the parameters are.
I would expect your struct to never instantiate properly, because a.dup is not a valid static initializer.
-Steve
|
March 03, 2011 Re: Parameterized Structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On Thu, 03 Mar 2011 06:25:36 -0500, bearophile <bearophileHUGS@lycos.com> wrote:
> Ali Çehreli:
>
>> <quote>
>> Template value parameter types can be any type which can be statically
>> initialized at compile time, and the value argument can be any
>> expression which can be evaluated at compile time. This includes
>> integers, floating point types, and strings.
>> </quote>
>
> I have needed arrays as template specialization arguments few times (I have used alias to solve the problem). Allowing strings but not arrays is one limitation that I don't understand.
An array literal is a runtime-initialized entity, much to the chagrin of Don and others (like myself).
There have been several pushes to try and get Walter to change array literals to immutable compile-time things, but it has so far not been accepted.
-Steve
|
March 03, 2011 Re: Parameterized Structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On 03/03/2011 12:25 PM, bearophile wrote: > Ali Çehreli: > >> <quote> >> Template value parameter types can be any type which can be statically >> initialized at compile time, and the value argument can be any >> expression which can be evaluated at compile time. This includes >> integers, floating point types, and strings. >> </quote> > > I have needed arrays as template specialization arguments few times (I have used alias to solve the problem). Allowing strings but not arrays is one limitation that I don't understand. > > Bye, > bearophile That may be because strings are immutable? Denis -- _________________ vita es estrany spir.wikidot.com |
March 03, 2011 Re: Parameterized Structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to Peter Lundgren | On 03/03/2011 05:56 AM, Peter Lundgren wrote: > Where can I go to learn about parameterized structs? I can't seem to find any > literature on the subject. In particular, what are you allowed to use as a > parameter? I would like to define a struct like so: > > struct MyStruct(T, T[] a) { > ... > } > > but I receive the following error: > > Error: arithmetic/string type expected for value-parameter, not T[] > > Are arrays not allowed? Finally managed to do it, I guess :-) ============================ bool[E] set (E : E[]) (E[] elements) { bool[E] set; foreach (element ; elements) set[element] = true; return set; } struct String (C : C[], alias characters) { alias typeof(characters) S; //~ alias ElementType!S C; // BUG! returns dchar bool[C] klass = null; private C[] s; this (S s) { this.klass = set!S(characters); this.def(s); } void def (S s = null) { if (s.length == 0) { this.s = s; return; } foreach (ch ; s) { if (ch !in this.klass) { auto message = format( "'%s' not in allowed class of characters" , ch); throw new Exception(message); } } this.s = s; } string toString () { return format("String!(%s,\"%s\")(\"%s\")", S.stringof, characters, this.s); } } unittest { auto s = String!(string, "abcde")(""); writeln(s); s.def("eca"); writeln(s); s = String!(string, "abcde")("ace"); writeln(s); s = String!(string, "abcde")("fgh"); // --> error writeln(s); } ============================ Some notes: * set is here to speed up character lookup among allowed klass (else, O(N) in array). * C: C[] in struct template is redondant, since C[] is typeof(characters). It is only needed to declare the set 'klass', because of a bug: ElementType!string returns dchar!!! Thus, it is would not be possible, I guess, to declare klass's type in the struct definition. * You must pass an init string (even if "") to call this() and construct klass. Because of another bug: there cannot be parameter-less constructors for structs. Also, set cannot be defined on toplevel of the struct def auto klass = set!S(characters); because it's not a constant according to dmd. (It is, in fact). Thus, I guess we must construct it inside this(). Denis -- _________________ vita es estrany spir.wikidot.com |
March 03, 2011 Re: Parameterized Structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to spir | spir:
> because of a bug: ElementType!string returns dchar!!! Thus, it is would not be possible, I guess, to declare klass's type in the struct definition.
>
> * You must pass an init string (even if "") to call this() and construct klass. Because of another bug: there cannot be parameter-less constructors for structs.
I think those two are not bugs.
Bye,
bearophile
|
March 03, 2011 Re: Parameterized Structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On 03/03/2011 03:25 AM, bearophile wrote: > Ali Çehreli: > >> <quote> >> Template value parameter types can be any type which can be statically >> initialized at compile time, and the value argument can be any >> expression which can be evaluated at compile time. This includes >> integers, floating point types, and strings. >> </quote> > > I have needed arrays as template specialization arguments few times (I have used alias to solve the problem). Allowing strings but not arrays is one limitation that I don't understand. And I thought that pointers to statically known instances could be a workaround, but no pointers allowed. (As an aside, C++ allows pointer template parameters.) Ali > > Bye, > bearophile |
Copyright © 1999-2021 by the D Language Foundation