从智能指针确定类型

时间:2011-05-10 20:47:35

标签: c++ templates

我有一个当前包含两个模板参数的函数。一个预计是智能指针,另一个预计是对象类型。例如,SmartPtr<MyObject>作为第一个模板参数,MyObject作为第二个模板参数。

template <typename T, typename TObject>

我想知道是否可以从第一个参数MyObject自动确定第二个参数SmartPtr<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;
}

4 个答案:

答案 0 :(得分:11)

如果您知道第一个模板参数将是智能指针类型,为什么不使用一个参数声明您的函数并使用它:

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

答案 1 :(得分: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)
{
  // ...
}

答案 2 :(得分:2)

你写过SmartPtr吗?如果是这样,请将其添加到其中

  typedef T element_type;

答案 3 :(得分:1)

我知道的所有智能指针都支持成员::element_type。例如boost的shared_ptr:http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/shared_ptr.htm#element_type,但std智能指针也支持此约定。

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

    // ...
};
相关问题