Am 03.04.2011 16:11, schrieb Philippe Sigaud: > On Sat, Apr 2, 2011 at 13:05, enuhtac <enuhtac_li...@gmx.de> wrote: >> This is the type I would like to check for: >> >> struct A( T, string s ) >> { ... }; > Hi, > > the trick is to use a function do the work for you. Let's define isAnA: > > void isAnA(T, string s)( A!(T,s) a) { } > > isAnA can only be called (compiled) with your A. > > A!(int, "abc") a; > A!(double, "") b; > > isAnA(a); // OK > isAnA(b); // OK > isAnA(123); // does not compile. > > So you can nest it in a template and check at compile-time if it compiles: > > template isMyA(Type) > { > static if (__traits(compiles, > { > void isAnA(T, string s)(A!(T,s) a) {} > isAnA(Type.init); // create a value of > type Type, see if isAnA accepts it. > })) > enum bool isMyA = true; > else > enum bool isMyA = false; > } > > Note that this is strictly tailored to A's with (T, string s) as > arguments. You can relax the constraints by adapting the test > function. > > For a more generic way to test for this, you can have a look there: > > http://svn.dsource.org/projects/dranges/trunk/dranges/docs/templates.html > ("isInstanceOf" and "Template ParametersTypeTuple") > http://svn.dsource.org/projects/dranges/trunk/dranges/docs/typepattern.html > (look for "isA") > > > Philippe
Hi Philippe, thanks for your answer. If it is that complicated if I prefer explicit specialization, I think. But I do not quite understand that it is not possible to achieve this with a simple "is" expression (without a function like "isAnA" and using "__traits") as the D language reference includes a very similiar example based on arrays: static if (is(int[10] W : W[V], int V)) what is the essential difference to: static if( is( A!(int, "xxx") T == A!(T, s), string s ) ) ? enuhtac