Confused by struct constructors
Simen kjaeraas
simen.kjaras at gmail.com
Sat Jan 23 18:41:47 PST 2010
On Sat, 23 Jan 2010 18:09:26 +0100, Philippe Sigaud
<philippe.sigaud at gmail.com> wrote:
> On Sat, Jan 23, 2010 at 14:44, Simen kjaeraas
> <simen.kjaras at gmail.com>wrote:
>
>> In attempting to create a function to initialize any array of structs
>> in a
>> simple manner, I created this code:
>>
>> void fillArr( uint n, T, U... )( ref T[] arr, U args ) {
>> arr[0] = T( U[0..n] );
>> static if ( U.length > n ) {
>> fillArr!( n )( arr[ 1..$ ], args[ n..$ ] );
>> }
>> }
>>
>
> U is a type . U[0..n] is also a type. You should write:
Thank you! Darn, I should have been able to see that.
> Maybe you could also use S.tupleof.length to get the number of fields in
> S
Yeah, I could. However, S might use a different constructor, taking a
different number of arguments.
As for bearophile's concerns:
struct simpleTuple( T... ) {
T payload;
}
simpleTuple!( T ) ຕ( T... )( T args ) {
return simpleTuple!( args );
}
T[] initArray( T, U... )( U args ) if ( is( typeof( T( args[0].tupleof )
) ) && allSame!( U ) ) {
T[] result = new T[ U.length ];
foreach ( i, arg; args ) {
result[ i ] = T( arg.tupleof );
}
return result;
}
struct S {
int n;
string s;
}
auto s = initArray!( S )( ຕ( 1, "a" ), ຕ( 2, "b" ), ຕ( 3, "c" ) );
If ຕ is too hard to type, choose another short name.
--
Simen
More information about the Digitalmars-d-learn
mailing list