March 03, 2011
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
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
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
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
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
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
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

1 2
Next ›   Last »