Going from TypeInfo of template to TypeInfo of template parameter/member
Bill Baxter
dnewsgroup at billbaxter.com
Tue Nov 13 00:24:46 PST 2007
Bill Baxter wrote:
> 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.
Update:
it did seem like it was going to work at first, but after a point I
started getting Optlink crashes. It started popping up this pretty
little MsgBox:
---------------------------
Unexpected OPTLINK Termination at EIP=0044C37B
---------------------------
EAX=01BA1318 EBX=00470800 ECX=00463EE0 EDX=00001001
ESI=012B4000 EDI=0046C72C EBP=0013FFF0 ESP=0013FF90
First=00430000
---------------------------
OK
---------------------------
--bb
More information about the Digitalmars-d-learn
mailing list