Определение типа по умному указателю - PullRequest
3 голосов
/ 11 мая 2011

У меня есть функция, которая в настоящее время принимает два параметра шаблона. Предполагается, что одним из них будет интеллектуальный указатель, а другим - тип объекта. Например, 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 ]

11 голосов
/ 11 мая 2011

Если вы знаете, что первым параметром шаблона будет тип интеллектуального указателя, почему бы не объявить вашу функцию только с одним параметром и использовать его как таковой:

template<typename T>
void WhatIsIt(SmartPtr<T> ptr)
{ 
    printf("It is a: %s" typeid(T).name());
}
3 голосов
/ 11 мая 2011

Если классы, которые могут служить в качестве первого параметра шаблона, могут быть созданы для предоставления удобного определения типа по общему имени, вы можете сделать это:

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 голосов
/ 11 мая 2011

Вы написали SmartPtr?Если так, добавьте это к этому

  typedef T element_type;
1 голос
/ 11 мая 2011

Все умные указатели, которых я знаю о поддержке члена ::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;

    // ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...