我正在尝试编写一个模板来提取 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 未定义。
为什么会这样呢?这将如何完成?
最佳答案
它不起作用,因为您匹配的是 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
继承看起来很难看。
关于c++ - 通过其基础匹配派生类型的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10145420/