2011-05-10 109 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