Я не знаю краткого и краткого пути.Но вы можете снова злоупотреблять перегрузкой
template< typename T, typename U >
std::true_type is_based_impl( std::basic_ostream<T, U> const volatile& );
std::false_type is_based_impl( ... );
template< typename T >
bool is_based_in_basic_ostream( T&& t ) {
return decltype(is_based_impl(t))::value;
}
Это только обнаружит публичное наследование.Обратите внимание, что вместо этого вы можете обнаружить деривацию из ios_base
, которая может работать для вас одинаково хорошо (этот тест также будет положительным для входных потоков, поэтому он имеет ограниченную применимость)
std::is_base_of<std::ios_base, T>