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









bearophile <bearophileHUGS lycos.com> 