2011-05-10 110 views
3

我有一個函數,目前需要兩個模板參數。預計一個是智能指針,另一個預計是對象類型。例如,SmartPtr<MyObject>作爲第一個模板參數,而MyObject作爲第二個模板參數。從智能指針確定類型

template <typename T, typename TObject> 

我想知道我是否可以從第一個參數SmartPtr<MyObject>或無法自動確定第二個參數,MyObject,讓我的模板函數是這樣寫的:

template <typename T> 

而且類型TObject中的原始模板函數是從T自動確定的,這是預期的智能指針。

按照要求,這裏是函數聲明及其使用:

template <typename T, typename TObject> 
T* CreateOrModifyDoc(T* doc, MyHashTable& table) 
{ 
    T* ptr = NULL; 

    if (!table.FindElement(doc->id, ptr)) 
    { 
     table.AddElement(doc->id, new TObject()); 
     table.FindElement(doc->id, ptr); 
    }  

    return ptr; 
} 
+0

發佈一些代碼。 – 2011-05-10 20:48:38

+0

你可以將這個函數粘貼到你的問題中嗎? – mkb 2011-05-10 20:50:53

+0

我們可以猜測,但爲了完全回答您的問題,您需要向我們展示函數聲明以及如何調用它。 – GManNickG 2011-05-10 20:51:44

回答

11

如果你知道第一個模板參數將是智能指針類型,爲什麼不能只用一個參數,聲明你的功能,並使用它因此:

template<typename T> 
void WhatIsIt(SmartPtr<T> ptr) 
{ 
    printf("It is a: %s" typeid(T).name()); 
} 
+0

-1呃。 AsString? – orlp 2011-05-10 20:56:35

+3

認真嗎? downvote,因爲我選擇字符串作爲示例代碼?我只是做了,函數體甚至不需要在那裏... – 2011-05-10 20:58:47

+0

@丹F:不,因爲你選擇字符串作爲類型標識符。 typedef有什麼問題? – orlp 2011-05-10 20:59:26

2

您是否寫過SmartPtr?如果是這樣,這給它添加

typedef T element_type; 
+0

使用'element_type'而不是'TDeref',以便嵌套類型的名字與'std :: shared_ptr <>'和'std :: unique_ptr <>'一致。 – ildjarn 2011-05-10 20:54:31

+0

@ildjarn謝謝 - 完成 – 2011-05-11 13:30:19

3

如果可以由可作爲第一個模板參數的類提供一個共同的名字一個方便的typedef,你可以這樣做:

template <typename T> 
class SmartPtr 
{ 
    public: 
    typedef T element_type; 

    // ... 
}; 


template <typename PtrType, typename ObjType=PtrType::element_type> 
void your_function_here(const PtrType& ptr) 
{ 
    // ... 
} 
+0

@ildjarn:好的電話。編輯。 – 2011-05-10 20:56:47