digitalmars.D.learn - is expression for template structs/classes instances?
- d coder (16/16) Dec 20 2010 Greetings
- bearophile (5/16) Dec 21 2010 I remember someone has shown here the URL of a module that given an inst...
- bearophile (4/5) Dec 21 2010 I have added this:
- Simen kjaeraas (10/24) Dec 21 2010 If you know the template you want to check for, isExpression works:
- d coder (5/11) Dec 21 2010 Thanks Simen
- d coder (14/16) Dec 21 2010 Simen
- Simen kjaeraas (4/21) Dec 21 2010 Glad to be of service.
- Jonathan M Davis (15/32) Dec 21 2010 Yes, that sort of thing works. The problem is when you want to know whet...
Greetings I want to find if a given struct type is instantiated from a particular template struct type. For example: struct S (T) { alias T Type; T t; } And later I want to find out if a given type is of type S(*) (basically any type instantiated from template struct S). In fact I do not know the type value T used at the time of instantiating S!(T). I was looking at "is ( Type Identifier : TypeSpecialization , TemplateParameterList )" expression at http://www.digitalmars.com/d/2.0/expression.html#IsExpression . Thought there would be some way using that, but I could not find any. Regards Cherry
Dec 20 2010
d coder:I want to find if a given struct type is instantiated from a particular template struct type. For example: struct S (T) { alias T Type; T t; } And later I want to find out if a given type is of type S(*) (basically any type instantiated from template struct S). In fact I do not know the type value T used at the time of instantiating S!(T).I remember someone has shown here the URL of a module that given an instantiated template, it returns the typetuple of its instantiation arguments. This code maybe returns the alias of the template before instantiation too. But I don't remember the name of the module. The need expressed in this post is very common, so some standard way to do it is necessary in Phobos or in __traits/meta. Bye, bearophile
Dec 21 2010
The need expressed in this post is very common, so some standard way to do it is necessary in Phobos or in __traits/meta.I have added this: http://d.puremagic.com/issues/show_bug.cgi?id=5361 Bye, bearophile
Dec 21 2010
d coder <dlang.coder gmail.com> wrote:Greetings I want to find if a given struct type is instantiated from a particular template struct type. For example: struct S (T) { alias T Type; T t; } And later I want to find out if a given type is of type S(*) (basically any type instantiated from template struct S). In fact I do not know the type value T used at the time of instantiating S!(T). I was looking at "is ( Type Identifier : TypeSpecialization , TemplateParameterList )" expression at http://www.digitalmars.com/d/2.0/expression.html#IsExpression . Thought there would be some way using that, but I could not find any.If you know the template you want to check for, isExpression works: S!int foo; static if ( is( typeof(foo) f == S!T, T ) ) { // Here, T == int, f == typeof(foo) } Note that the syntax "is ( Type Identifier : TypeSpecialization , TemplateParameterList )" is only usable inside static if. -- Simen
Dec 21 2010
S!int foo; static if ( is( typeof(foo) f =3D=3D S!T, T ) ) { =A0 =A0// Here, T =3D=3D int, f =3D=3D typeof(foo) } Note that the syntax "is ( Type Identifier : TypeSpecialization , TemplateParameterList )" is only usable inside static if.Thanks Simen I do know the template. I will try out your solution. Will let you know if I face issues. Regards - Cherry
Dec 21 2010
I do know the template. I will try out your solution. Will let you know if I face issues.Simen It works perfect, And this is exactly what I was looking for. If you see my original post, I also thought this form of "is" expression should work. Just could not get around to the right syntax. With your help it is working now. I am using a slightly more elaborate check which is obvious but I am writing it here to just let the list know. static if ( is( typeof(foo) f == S!T, T : int) ) { // foo is an object of type S!T // where T is convertible to int } Thanks once more Warm Regards - Cherry
Dec 21 2010
d coder <dlang.coder gmail.com> wrote:Glad to be of service. -- SimenI do know the template. I will try out your solution. Will let you know if I face issues.Simen It works perfect, And this is exactly what I was looking for. If you see my original post, I also thought this form of "is" expression should work. Just could not get around to the right syntax. With your help it is working now. I am using a slightly more elaborate check which is obvious but I am writing it here to just let the list know. static if ( is( typeof(foo) f == S!T, T : int) ) { // foo is an object of type S!T // where T is convertible to int } Thanks once more Warm Regards - Cherry
Dec 21 2010
On Tuesday, December 21, 2010 02:57:45 d coder wrote:Yes, that sort of thing works. The problem is when you want to know whether an arbitrary type is an instantiation of a particular template. For instance, if you have struct S(T) { } struct Q(T) { } and you pass S!int to Q - Q(S!int) - Q sees S!int is a specific type, not an instantiation of S, so it's difficult to have a template constraint checking that the type passed to Q is an instantiation of S. However, if you know exactly which instantiation that you're checking for, then it's relatively easy. - Jonathan M DavisI do know the template. I will try out your solution. Will let you know if I face issues.Simen It works perfect, And this is exactly what I was looking for. If you see my original post, I also thought this form of "is" expression should work. Just could not get around to the right syntax. With your help it is working now. I am using a slightly more elaborate check which is obvious but I am writing it here to just let the list know. static if ( is( typeof(foo) f == S!T, T : int) ) { // foo is an object of type S!T // where T is convertible to int }
Dec 21 2010