Re: Dynamic Ctors ?

2016-02-08 Thread Voitech via Digitalmars-d-learn

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.


Re: Dynamic Ctors ?

2016-02-08 Thread Voitech via Digitalmars-d-learn

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; // ?
}

}

}









Re: Dynamic Ctors ?

2016-02-08 Thread Kagamin via Digitalmars-d-learn

http://dpaste.dzfl.pl/1f25ac34c1ee
You need Tuple, not Algebraic. Algebraic stores only one value of 
one type from a set, like Variant.


Re: Dynamic Ctors ?

2016-02-07 Thread Voitech via Digitalmars-d-learn

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


Re: Dynamic Ctors ?

2016-02-06 Thread Ali Çehreli via Digitalmars-d-learn

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



Re: Dynamic Ctors ?

2016-02-06 Thread Voitech via Digitalmars-d-learn

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