c++ - 如何判断一个类型是否派生自模板类?

标签 c++ templates metaprogramming c++11 typetraits

如何确定类型是否派生自模板类?特别是,我需要确定模板参数是否将 std::basic_ostream 作为基类。通常 std::is_base_of 是完成这项工作的工具。但是,std::is_base_of 仅适用于完整类型,不适用于类模板。

我正在寻找这样的东西。

template< typename T >
bool is_based_in_basic_ostream( T&& t )
{
   if( std::is_base_of< std::basic_ostream< /*anything*/>, T >::value )
   {
      return true;
   }
   else
   {
      return false;
   }
}

我确信这是可以做到的,我想不出怎么做。

最佳答案

我不知道有什么简洁明了的方法。但是你可以再次滥用重载

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;
}

它只会检测公共(public)继承。请注意,您可以改为检测来自 ios_base 的派生,这可能同样适用于您(此测试对于输入流也将是积极的,因此它的适用性有限)

std::is_base_of<std::ios_base, T>

关于c++ - 如何判断一个类型是否派生自模板类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5997956/

相关文章:

c++ - 函数局部静态常量变量初始化语义

c++ - 访问 getter 的真正底层类型?

c++ - Valgrind: "Invalid write of size 1"在 char[] 到 std::vector<char> 迁移之后

带有模板基类的 C++ std::shared_pointer

python - 您如何调试 Mako 模板?

python - 控制python对象的实例化

c++ - 构造一个没有默认构造函数的空对象

c++ - 在 C++ 中重载 + 运算符时第一个参数是字符串的问题

c++ - MITM 代理,TLS 1.2 证书验证失败

c++ - C++ 的类模板中是否可以有一个通用的、非专用的静态成员?