Я знаю, что этот вопрос старый, но я сталкивался с той же проблемой, когда у меня есть универсальный класс, тип T которого неизвестен (использование библиотеки), и в результате T может быть или не быть полиморфным, но мне нужно используйте dynamic_cast
для реализации некоторого поведения.
Я не уверен, что это лучшее решение, но мне удалось написать «универсальное» динамическое приведение, которое компилируется по-разному на основе T с использованием SFINAE (https://en.cppreference.com/w/cpp/language/sfinae)
template<typename U>
class Cast
{
public:
template<typename T>
static inline U dynamic(T *iPtr, typename std::enable_if<!std::is_polymorphic<T>::value>::type * = nullptr)
{
return nullptr;
}
template<typename T>
static inline U dynamic(T *iPtr, typename std::enable_if<std::is_polymorphic<T>::value>::type * = nullptr)
{
return dynamic_cast<U>(iPtr);
}
};
Так что для вашего конкретного примера это становится
void function()
{
BaseClass * base = Cast<BaseClass *>::dynamic(my_member);
if(base != 0)
{
// DO SOMETHING
}
else
{
// DO SOMETHING ELSE
}
}