如何确定类型是否来自模板类?

def*_*ode 12 c++ templates metaprogramming type-traits c++11

如何确定类型是否来自模板类?特别是,我需要确定模板参数是否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;
   }
}
Run Code Online (Sandbox Code Playgroud)

我敢肯定这可以做到我想不出怎么做.

Joh*_*itb 13

我不知道简短的方式.但是你可以再次滥用重载

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;
}
Run Code Online (Sandbox Code Playgroud)

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

std::is_base_of<std::ios_base, T>
Run Code Online (Sandbox Code Playgroud)


blu*_*rni 5

像Boost那样的东西可能就像你追求的那样吗?

http://www.boost.org/doc/libs/1_46_1/boost/lambda/detail/is_instance_of.hpp

以下是单参数模板的简短版本:

#include <iostream>
#include <type_traits>

template <template <typename> class F>
struct conversion_tester
{
        template <typename T>
        conversion_tester (const F<T> &);
};

template <class From, template <typename> class To>
struct is_instance_of
{
        static const bool value = std::is_convertible<From,conversion_tester<To>>::value;
};

template <typename T>
struct foo {};

template <typename T>
struct bar {};

int main()
{
        std::cout << is_instance_of<foo<int>,foo>::value << '\n'; // This will print '1'.
        std::cout << is_instance_of<bar<int>,foo>::value << '\n'; // This will print '0'.
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果您尝试将其扩展为可变参数模板,使用当前的GCC(4.6.0),它将产生错误消息.这个SO答案意味着这是目前GCC的一个问题,并且可变模板版本应该按照标准工作.