C ++ 14
Я проголосовал этот ответ , который является хорошей демонстрацией для SFINAE. Чтобы расширить его, вы можете упростить выражение SFINAE с помощью std::is_convertible
. Это более аналогично тому, как будет работать разрешение перегрузки (добавление константного квалификатора).
template<typename T, std::enable_if_t<std::is_convertible_v<T*, const A*>, int> = 0>
void Do(T* data)
{
std::cout << "Do(A*)\n";
}
template<typename T, std::enable_if_t<std::is_convertible_v<T*, const B*>, int> = 0>
void Do(T* data)
{
std::cout << "Do(B*)\n";
}
C ++ 17
В качестве бонуса, в C ++ 17 с constexpr if
Вы можете использовать одну функцию для всех случаев:
template<typename T>
void Do(T data)
{
if constexpr (std::is_convertible_v<T, const A*>)
std::cout << "Do(A*)\n";
else if constexpr (std::is_convertible_v<T, const B*>)
std::cout << "Do(B*)\n";
else
std::cout << "Do() default\n";
}