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