Switch passed type from template

Yes, it is…but it probably won’t work the way you expect.

template < typename T >
void foo()
{
    if (is_same<T, SomeClass>::value) ...;
    else if (is_same<T, SomeClass2>::value) ...;
}

You can get is_same from std:: or boost:: depending on your desire/compiler. The former is only in C++0x.

The problem comes with what is in .... If you expect to be able to make some function call specific to those types within foo, you are sadly mistaken. A compiler error will result even though that section of code is never run when you pass in something that doesn’t obey that expected interface.

To solve THAT problem you need to do something a bit different. I’d recommend tag dispatching:

struct v1_tag {};
struct v2_tag {};

template < typename T > struct someclass_version_tag;
template < > struct someclass_version_tag<SomeClass> { typedef v1_tag type; };
template < > struct someclass_version_tag<SomeClass2> { typedef v2_tag type; };

void foo(v1_tag) { ... }
void foo(v2_tag) { ... }
template < typename T > void foo()
{
    typedef typename someclass_version_tag<T>::type tag;
    foo(tag());
}

Note that you will not be suffering any runtime-polymorphism overhead here and with optimizations turned on it should result in the same or even smaller code size AND speed (though you shouldn’t be worrying about that anyway until you’ve run a profiler).

Leave a Comment