模板匹配派生类型的基础

时间:2012-04-13 17:23:42

标签: c++ templates metaprogramming

我正在尝试编写一个模板,它将提取boost :: shared_ptr的基本类型。

我写了这个模板:

template<typename T>
struct ExtractBaseType;

template<typename T>
struct ExtractBaseType<boost::shared_ptr<T> > 
{
    typedef T type;
};

它适用于普通的shared_ptr。这样:

struct A
{
};

ExtractBaseType<boost::shared_ptr<A> >::type  a_thing;
std::cout << typeid(a_thing).name() << std::endl;

打印“1A”。

但是,这不会编译:

struct B : boost::shared_ptr<A>
{
};

ExtractBaseType<B>::type  b_thing;

编译器抱怨ExtractBaseType未定义。

为什么这样?怎么做呢?

1 个答案:

答案 0 :(得分:4)

它不起作用,因为您匹配shared_ptr而不是B。您需要匹配shared_ptr的派生。

template<typename T, class = void>
struct ExtractBaseType;

template<class C>
struct ExtractBaseType<
    C, typename enable_if<
           boost::is_base_of<shared_ptr<typename T::element_type>, T>::value
       >::type
    > 
{
    typedef typename T::element_type type;
};

^没有测试,但主要的想法是

好问题。也就是说,继承自shared_ptr似乎很难看。