如何基于特定的派生类调用方法

时间:2015-12-29 14:28:07

标签: c++ templates c++11

我试图理解弱指针成员(使用visual studio 2013 C ++编译器)

mutable weak_ptr<_Ty> _Wptr
当从派生自它的对象创建enable_shared_from_this时,模板类std::shared_ptr<_Ty>中的

被初始化。为此,我从一个使用模板函数std::shared_ptr<_Ty>

创建std::make_share<_Ty>的简单代码中跟踪代码。

我发现当编译器在基类_Wptr中调用方法_Enable_shared时,_Ref_count_del_alloc的初始化就会继续。

现在为此目的定义了2个模板方法。当_Ty类派生自enable_shared_from_this时,定义了一种方法。这是方法:

template<class _Ty>
inline void _Enable_shared(_Ty *_Ptr, _Ref_count_base *_Refptr,
    typename _Ty::_EStype * = 0)
{   // reset internal weak pointer
if (_Ptr)
    _Do_enable(_Ptr,
        (enable_shared_from_this<typename _Ty::_EStype>*)_Ptr, _Refptr);
}

第二种方法是在_Ty派生自enable_shared_from_this时定义的。这是方法:

inline void _Enable_shared(const volatile void *, const volatile void *)
{   
    // not derived from enable_shared_from_this; do nothing
}

我遇到的问题是C ++编译器如何解析使用哪种方法?除此之外,我希望在编译时实例化这两个方法,如果类不是从enable_shared_from_this派生的,那么会产生编译错误。然而,编译器似乎只选择一种方法来实例化和适当的方法。

1 个答案:

答案 0 :(得分:1)

在深入研究代码之后,我发现理解这是如何完成的关键点是通过Kerry SB指出的函数模板专业化。由于_EStype仅在enable_shared_from_this基本模板类中定义,因此编译器能够根据参数中较不合理的调用在_Enable_shared函数模板之间进行选择。

Herb Sutter的以下文章对此进行了详细解释:

Why Not Specialize Function Templates?