Going from TypeInfo of template to TypeInfo of template parameter/member
Bill Baxter
dnewsgroup at billbaxter.com
Mon Nov 12 17:56:05 PST 2007
Kirk McDonald wrote:
> Bill Baxter wrote:
>> I'm trying to get info about types from their TypeInfo.
>>
>> Say I have a struct like
>>
>> struct Container(T)
>> {
>> T[] elems;
>> }
>>
>> And I have a TypeInfo for a Container!(float). Is there any way to
>> get the TypeInfo for a float out of that? Or a double, or int, or
>> whatever it happens to be.
>>
>> TypeInfo get_container_element_type(TypeInfo container_typeinfo)
>> {
>> ???
>> }
>>
>> The TypeInfo's .next and .offTi are both null, so that's no help.
>> The toString includes the stringized version of the type "float",
>> though, so I could try to use that. Seems unreliable though.
>>
>> Thanks for any suggestions.
>> --bb
>
> Not in the general case. However, you can easily add something like this:
>
> struct Container(T) {
> alias T value_type;
> T[] elems;
> }
>
> Thus, Container!(float).value_type will be float.
>
But all I have is the TypeInfo for the Container!(float). I'm trying to
go from runtime TypeInfo's to concrete types via big if-else constructs.
Like so:
void do_stuff(TypeInfo it) {
if (it == typeid(float)) {
do_something_concrete!(float)();
}
else if (it == typeid(float)) {
do_something_concrete!(float)();
}
else if (it is some instantiation of Container!(T)) {
if (typeinfo of container's value_type == typeid(float)) {
do_something_concrete!(Container!(float))();
}
else if (...)
...
}
}
But anyway, in writing this out I just realized that I can just test
against typeinfo of instances of the container like
else if (it = typeid(Container!(float)) {... }
else if (it = typeid(Container!(int)) {... }
I was just hoping to reuse the code for "match TypeInfo to basic type".
Maybe there's still a way though. I could do something like
template ident(T) { alias T ident; }
bool match_element_type(alias C)(TypeInfo it)
{
if ( it == typeid(C!(float)) ) {
do_something_concrete!(C!(float))();
return true;
}
...
return false;
}
...
//try to match basic types
do {
if (match_element_type(ident)(it)) break;
if (match_element_type(Container)(it)) break;
...
}
Seems like that should work.
--bb
More information about the Digitalmars-d-learn
mailing list