13

如何确定类型是否派生自模板类?特别是,我需要确定模板参数是否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;
   }
}

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

4

2 回答 2

14

我不知道简洁的方式。但是你可以再次滥用超载

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>
于 2011-05-13T22:14:02.477 回答
5

像 Boost 的 is_instance_of 这样的东西可能是你所追求的吗?

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

这是 1 参数模板的简短版本:

#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'.
}

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

于 2011-05-14T02:24:54.237 回答