import std.stdio , std.typecons ;
/* hack for 2.042 and older compilers (February 2010)
* present on ideone
*/
struct My_Tuple( T... )
{
Tuple! T base;
alias base this ;
this ( T args) { this .base = Tuple! T( args) ; }
U opIndex( U) ( size_t idx) { return this .field [ idx] ; }
}
My_Tuple! T make_tuple( T... ) ( T args)
{
return typeof ( return ) ( args) ;
}
/* TESTING FUNCTION */
int [ ] foo( T... ) ( T args)
{
writeln( "Called foo ..." ) ;
foreach ( i, arg; args)
writefln( " args[%d] == %s" , i, arg) ;
writeln( "... foo end" ) ;
return [ 5 , 10 , 15 , 20 ] ;
}
/* UNPACKER */
auto unpack( alias fun, V... ) ( ref My_Tuple! V t)
{
auto f( size_t i, U... ) ( U args)
{
static if ( i == 0 )
return fun( args) ;
else
return f! ( i - 1 ) ( t[ i - 1 ] , args) ;
}
return f! ( V.length ) ( ) ;
}
/* main */
void main( )
{
auto tup = make_tuple(
5 , 3.14f , "hello world" , [ 5 , 10 , 15 ] , [ "foo" : 5 , "bar" : 10 ]
) ;
auto ret = unpack! foo( tup) ;
writeln( "retval from foo: " , ret) ;
}
aW1wb3J0IHN0ZC5zdGRpbywgc3RkLnR5cGVjb25zOwoKLyogaGFjayBmb3IgMi4wNDIgYW5kIG9sZGVyIGNvbXBpbGVycyAoRmVicnVhcnkgMjAxMCkKICogcHJlc2VudCBvbiBpZGVvbmUKICovCnN0cnVjdCBNeV9UdXBsZShULi4uKQp7CiAgICBUdXBsZSFUIGJhc2U7CiAgICBhbGlhcyBiYXNlIHRoaXM7CgogICAgdGhpcyhUIGFyZ3MpIHsgdGhpcy5iYXNlID0gVHVwbGUhVChhcmdzKTsgfQogICAgVSBvcEluZGV4KFUpKHNpemVfdCBpZHgpIHsgcmV0dXJuIHRoaXMuZmllbGRbaWR4XTsgfQp9CgpNeV9UdXBsZSFUIG1ha2VfdHVwbGUoVC4uLikoVCBhcmdzKQp7CiAgICByZXR1cm4gdHlwZW9mKHJldHVybikoYXJncyk7Cn0KCi8qIFRFU1RJTkcgRlVOQ1RJT04gKi8KCmludFtdIGZvbyhULi4uKShUIGFyZ3MpCnsKICAgIHdyaXRlbG4oIkNhbGxlZCBmb28gLi4uIik7CiAgICBmb3JlYWNoIChpLCBhcmc7IGFyZ3MpCiAgICAgICAgd3JpdGVmbG4oIiAgICBhcmdzWyVkXSA9PSAlcyIsIGksIGFyZyk7CiAgICB3cml0ZWxuKCIuLi4gZm9vIGVuZCIpOwoKICAgIHJldHVybiBbIDUsIDEwLCAxNSwgMjAgXTsKfQoKLyogVU5QQUNLRVIgKi8KCmF1dG8gdW5wYWNrKGFsaWFzIGZ1biwgVi4uLikocmVmIE15X1R1cGxlIVYgdCkKewogICAgYXV0byBmKHNpemVfdCBpLCBVLi4uKShVIGFyZ3MpCiAgICB7CiAgICAgICAgc3RhdGljIGlmIChpID09IDApCiAgICAgICAgICAgIHJldHVybiBmdW4oYXJncyk7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gZiEoaSAtIDEpKHRbaSAtIDFdLCBhcmdzKTsKICAgIH0KICAgIHJldHVybiBmIShWLmxlbmd0aCkoKTsKfQoKLyogbWFpbiAqLwoKdm9pZCBtYWluKCkKewogICAgYXV0byB0dXAgPSBtYWtlX3R1cGxlKAogICAgICAgIDUsIDMuMTRmLCAiaGVsbG8gd29ybGQiLCBbIDUsIDEwLCAxNSBdLCBbICJmb28iOjUsICJiYXIiOjEwIF0KICAgICk7CgogICAgYXV0byByZXQgPSB1bnBhY2shZm9vKHR1cCk7CiAgICB3cml0ZWxuKCJyZXR2YWwgZnJvbSBmb286ICIsIHJldCk7Cn0K
compilation info
prog.d(41): Error: template prog.My_Tuple!(int,float,string,int[],int[string]).My_Tuple.opIndex(U) does not match any function template declaration
prog.d(41): Error: template prog.My_Tuple!(int,float,string,int[],int[string]).My_Tuple.opIndex(U) cannot deduce template function from argument types !()(uint)
stdout