2014-10-11 70 views
3

我想從頭開始學習shared_ptr是如何工作的,我無法弄清楚如何檢測T的基類。shared_ptr <T>如何檢測到T派生自enable_shared_from_this <T>?

我試過使用is_base_of(),但是這給出了一個const值,我不能使用if語句來設置對象的內部weak_ptr。

我是基於這樣的思考:

template <class T> 
class shared_ptr 
{ 
    shared_ptr(T* ptr) 
    { 
     ... 
    } 

    shared_ptr(enable_shared_from_this<T>* ptr) 
    { 
     ... 

     Ptr->m_this = weak_ptr<T>(this); 
    } 
}; 

,但至今沒有運氣。 Boost和VC++的實現對我來說太混亂了,我正在尋找一個簡單的解釋。

Here它說

STD的構造:: shared_ptr的檢測enable_shared_from_this鹼的存在下與新創建的std :: shared_ptr的分配給該內部存儲的弱引用。

是啊,怎麼樣?

回答

1

簡單 - 使用模板參數演繹!這是世界上所有問題的解決方案,但您已經知道了:)基於提升方式的解決方案解決了您的問題。我們創建了一個實際處理構造細節的模板幫助類。

template <class T> 
class shared_ptr 
{ 
    shared_ptr(T* ptr) 
    { 
     magic_construct(this, ptr, ptr); 
    } 
}; 

template <class X, class Y, class Z> 
void magic_construct(shared_ptr<X>* sp, Y* rp, enable_shared_from_this<Z>* shareable) 
{ 
//Do the weak_ptr handling here 
} 

void magic_construct(...)//This is the default case 
{ 
//This is the case where you have no inheritance from enable_shared_from_this 
} 
+0

爲什麼不夠的,只是有'模板 magic_construct(enable_shared_from_this *股)'?爲什麼我需要'sp'和'rp'參數? – Alex 2014-10-22 10:01:58

1

一種選擇是基於函數模板重載。

這裏是一個簡化的解決方案: 我們有兩個類A和B. A類派生從H. 功能is_derived_from_h過載並且可用於檢測某些類X是否從H.

#include <stdlib.h> 
#include <iostream> 

class H {}; 
class A: public H {}; 
class B {}; 

// (1) 
template <typename X> 
void is_derived_from_h(X* px, H* ph) { 
    std::cout << "TRUE" << std::endl; 
} 

// (2) 
void is_derived_from_h(...) { 
    std::cout << "FALSE" << std::endl; 
} 

int main(int argc, char* argv[]) { 

    A* pa = new A; 
    B* pb = new B; 

    is_derived_from_h(pa, pa); // (1) is selected, the closest overload 
    is_derived_from_h(pb, pb); // (2) is selected, (1) is not viable 

    delete pa; 
    delete pb; 

    return EXIT_SUCCESS; 
} 
衍生

輸出:

TRUE 
FALSE 

在加速的情況下,跟蹤以下呼叫:

shared_ptr(Y * p) 
-> 
boost::detail::sp_pointer_construct(this, p, pn); 
    -> 
boost::detail::sp_enable_shared_from_this(ppx, p, p); 

Threre是sp_enable_shared_from_this的幾個版本。根據Y是否來自enable_shared_from_this而選擇的版本。

相關問題