<div class="gmail_quote">On Fri, Aug 6, 2010 at 21:59, Rory Mcguire <span dir="ltr">&lt;<a href="mailto:rjmcguire@gm_no_ail.com">rjmcguire@gm_no_ail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div><div></div><div class="h5">
<br>
</div></div>Here is a possible solution to your problem:<br>
<font color="#888888"><br>
-Rory</font></blockquote><div><br>I believe you can get the type of A. Isn&#39;t it typeof(super) or std.traits.BaseClassesTuple!B[0] ? B in the latter case being typeof(this)<br>That way, there is no need for the user to provide A, it&#39;s automatically found by the template.<br>
Warning: I did not test this.<br><br>And, we know the constructs are of type &#39;A function(someTypes)&#39;  [*], so the &#39;A function&#39; part is redundant.<br>Hence, the user only needs to provide for the args types and that makes for a cleaner call.<br>
<br>* either as a list : <br>    mixin(InheritConstructors!(int, double, string)); // I want to inherit the constructors taking one type, build me the __ctors for int, double and string<br><br>* or, in the case of multi-parameters constructors, wrap them in a tuple:<br>
    mixin(InheritConstructors!(int, double, Tuple!(int, double)); // I want super(int), super(double) and super(int, double)<br><br>That means iterating on the type list, and determining if the current type is a tuple or not<br>
* if its a &#39;normal&#39; type, create the corresponding contructor<br>* if it&#39;s a Tuple, crack it open and get the types, using the .Types alias std.typecons.Tuples have. Creating a constructor from this typetuple is no different from creating it for one type.<br>
<br>To determine if something is a std.typecons.Tuple, you cannot use an is() expression: they do not allow multiple types:<br><br>enum bool isTuple = is(T == Tuple!U, U...); // no. U... is not allowed. Hmm, enhancement request?<br>
<br>So, you can either rely on it having a .Types &#39;member&#39;:<br><br>template isTuple(T)<br>{<br>  enum bool isTuple = is(T.Types);<br>}<br><br>Pb: that will flag as tuples any type that exposes a &quot;.Types&quot; alias.<br>
<br>Or use a function accepting a Tuple:<br><br>template isTuple(T)<br>{<br>    enum bool isTuple = is(typeof({<br>                                   void foo(U...)(Tuple!U t) {}; // this function accepts only tuples<br>                                   foo(T.init); // test it<br>
                                  }()));<br>}<br><br>It&#39;s ugly as a rat&#39;s ass, but it&#39;s more solid than the former template.<br><br><br>Philippe<br><br>[*] btw, shouldn&#39;t that be A delegate(someTypes)??? <br>
</div></div><br>