Да, это так ... но, вероятно, это не сработает так, как вы ожидаете.
template < typename T >
void foo()
{
if (is_same<T,SomeClass>::value) ...;
else if (is_same<T,SomeClass2>::value) ...;
}
Вы можете получить is_same
из std::
или boost::
в зависимости от вашего желания / компилятора. Первый только в C ++ 0x.
Проблема в том, что в ...
. Если вы ожидаете, что сможете выполнить какой-либо вызов функции, специфичный для этих типов в foo, вы сильно ошибаетесь. Ошибка компилятора, даже если эта часть кода никогда не запускается, когда вы передаете что-то, что не соответствует ожидаемому интерфейсу.
Чтобы решить эту проблему, вам нужно сделать что-то немного другое. Я бы порекомендовал диспетчеризацию тегов:
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());
}
Обратите внимание, что здесь вы не будете испытывать никаких издержек во время исполнения-полиморфизма, и при включенной оптимизации это должно привести к тому же или даже меньшему размеру кода И скорости (хотя вам все равно не следует беспокоиться об этом, пока вы не запустите профиль).