Thread overview |
---|
February 06, 2016 Dynamic Ctors ? | ||||
---|---|---|---|---|
| ||||
Hi, i have a variadic args template, with a class inside something like: template foo(T...){ class Inner(){ ... ... } } Now i want to make Inner create or i will create manually, constructor for each of T... parameter types, but don't know what is syntax for it. I found that there is possibility to initialize T... types static variables with AliasSeq!(T) but how to do this automatically, or with static ifs,for constructors ? I tried ... template foo(T...){ alias Types=AliasSeq!(T); Algebraic!(T) value; this(Types value) this.value=value; } } But this dosn't work |
February 06, 2016 Re: Dynamic Ctors ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Voitech | On Saturday, 6 February 2016 at 18:05:05 UTC, Voitech wrote:
> Hi, i have a variadic args template, with a class inside something like:
>
> template foo(T...){
>
>
> class Inner(){
>
> ...
> ...
> }
>
>
>
> }
>
> Now i want to make Inner create or i will create manually, constructor for each of T... parameter types, but don't know what is syntax for it. I found that there is possibility to initialize T... types static variables with AliasSeq!(T) but how to do this automatically, or with static ifs,for constructors ?
> I tried ...
>
> template foo(T...){
> alias Types=AliasSeq!(T);
> Algebraic!(T) value;
> this(Types value)
> this.value=value;
> }
> }
> But this dosn't work
This gives Error: memcpy cannot be interpreted at compile time, because it has no available source code
|
February 06, 2016 Re: Dynamic Ctors ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Voitech | On 02/06/2016 10:05 AM, Voitech wrote: > create manually, constructor > for each of T... parameter types You can use string mixins (makeCtor and makeCtors): string makeCtor(T)() { import std.string : format; return format(q{ this (%s t) { import std.stdio : writefln; writefln("Ctor for %%s", %s.stringof); } }, T.stringof, T.stringof); } // Note: Use a pragma(msg) to see what it generates: // pragma(msg, makeCtor!int); string makeCtors(T...)() { string result; foreach (Type; T) { result ~= makeCtor!Type(); } return result; } mixin template foo(T...) { class Inner { mixin (makeCtors!T()); } } mixin foo!(int, string); void main() { auto i = new Inner(42); auto s = new Inner("hello"); } Output: Ctor for int Ctor for string Ali |
February 08, 2016 Re: Dynamic Ctors ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Saturday, 6 February 2016 at 23:35:17 UTC, Ali Çehreli wrote:
> On 02/06/2016 10:05 AM, Voitech wrote:
>
> > [...]
>
> You can use string mixins (makeCtor and makeCtors):
>
> string makeCtor(T)() {
> import std.string : format;
>
> [...]
Thank you very much for answering.
Cheers
|
February 08, 2016 Re: Dynamic Ctors ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Voitech | On Monday, 8 February 2016 at 07:08:58 UTC, Voitech wrote:
> On Saturday, 6 February 2016 at 23:35:17 UTC, Ali Çehreli wrote:
>> On 02/06/2016 10:05 AM, Voitech wrote:
>>
>> > [...]
>>
>> You can use string mixins (makeCtor and makeCtors):
>>
>> string makeCtor(T)() {
>> import std.string : format;
>>
>> [...]
>
> Thank you very much for answering.
> Cheers
Unfortunately this doesn't work as I'am trying to assign value from ctor to member something like:
this(%s value){
this.value=value;
}
it gives me
Error: memcpy cannot be interpreted at compile time, because it has no available source code.
Probably this is caused by declaration of member which is also parametrized with T...
Member is:
Algebraic!(T) value;
So declaration of this mixin constructors are done before variable value is declared (compilation)?
Is there any field in class that would contain ctors ? Something like __ctors ?
i could try to init this(T... value) constructors in static constructor using delegates/functions. Something like:
template Outer(T...){
class Inner{
Algebraic!(T) value;
alias ctor(Type) =Inner delegate (Type value);
static this(){
foreach(Type;T){
ctor!(Type) c={
this.value=value;
};
__ctors~=c; // ?????
}
}
}
|
February 08, 2016 Re: Dynamic Ctors ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Voitech | http://dpaste.dzfl.pl/1f25ac34c1ee You need Tuple, not Algebraic. Algebraic stores only one value of one type from a set, like Variant. |
February 08, 2016 Re: Dynamic Ctors ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Kagamin | On Monday, 8 February 2016 at 15:09:30 UTC, Kagamin wrote:
> http://dpaste.dzfl.pl/1f25ac34c1ee
> You need Tuple, not Algebraic. Algebraic stores only one value of one type from a set, like Variant.
Thank you for answering. You right if i would want to store all types of T.. in an Inner instance. But my conception was bad from the beginning. I want to store only one type of value in Inner instance. I just wanted to create generic constructor for each of Type which is invalid, cause instance holds value of single type that's why it is not parametrized by itself.
|
Copyright © 1999-2021 by the D Language Foundation