Вторая функция лучше подходит, поскольку для нее не требуется преобразование, тогда как для первой функции требуется преобразование из производной в основание.
Вы можете использовать повышение, чтобы преодолеть это:
template <class T>
void
match (typename boost::enable_if_c
<boost::is_base_of<protocol_object<T>,T>::value, T>::type& t)
{
std::cout << "protocol_class";
}
template <class T>
void
match (typename boost::disable_if_c
<boost::is_base_of<protocol_object<T>,T>::value, T>::type& t)
{
std::cout << "any other type";
}
Это будет работать для всех классов T
, полученных из protocol_object<T>
, но не для самого protocol_object<T>
. Вы можете добавить для него еще одну перегрузку (в основном, повторно использовать свою первую match
функцию) или изменить условие в enable_if
так, чтобы оно совпадало с protocol_object<T>
.