Вы хотите использовать C ++ 17, если constexpr:
if constexpr(std::is_base_of<A, T>::value)
{
//complex types, derived from A
std::cout << static_cast<A*>(t)->Get();
}
else
{
//basic types(int, float, string etc...)
std::cout << *t;
}
Проблема в том, что даже если во время компиляции вы знаете, что T является int*
, классический if
все равно будет оценивать все ветви.
Другой вариант - использовать std::enable_if
, например:
template <typename T>
std::enable_if<std::is_base_of<A, T>::value, void> Echo(T* t)
{
std::cout << dynamic_cast<A*>(t)->Get();
}
И аналогично для другой ветки.
После комментария вы действительно знаете, что T
- это A
, поэтому используйте static_cast
.