2012-03-12 5 views
3

Я делаю класс, который добавляет некоторые основные операции в std :: map, и я хотел бы автоматически вызвать удалить после удаления элемента с карты. Но если второе (T2) значение не является указателем, это невозможно. Есть ли способ проверить?Вызов delete только в том случае, если значение является указателем

template <class T,class T2> 
bool CExtendedMap<T,T2>::remove(T ID) 
{ 
    if(theMap.find(ID)!=theMap.end()) 
    { 
     T2 second = theMap.find(ID)->second; 
     theMap.erase(theMap.find(ID)); 
     //delete second; //Had to comment it out now. 
     return true; 
    } 
    return false; 
} 

ответ

5

Если я правильно понял ваш вопрос, вы бы хотели по-другому вести себя, если значение пары, хранящейся в вашем CExtendedMap, является или не является указателем.

Одним из простых способов решения проблемы является использование шаблонных перегрузок для получения желаемого эффекта.

Внедрение функции-обертки, которая будет использовать delete, если параметр является указателем, или ничего не делать, если это не так, это самое простое решение.

Пример реализации приведен ниже:

template<class T> inline 
void delete_or_nop (T const&) {/* NOP */} 

template<class T> inline 
void delete_or_nop (T* const& p) {delete p;} 

int 
main (int argc, char *argv[]) 
{ 
    int * p = 0; 
    int n = 0; 

    delete_or_nop (p); 
    delete_or_nop (n); 
} 
+0

Пожалуйста, используйте ссылку, поскольку материал для копирования может быть дорогим *, особенно * если вы ничего не с этим справляетесь. – Xeo

+0

@Xeo исправлено, сообщение отредактировано. –

+0

Не могу поверить, что я не думал об этом сам .. как глупо! – natli

8

Используйте интеллектуальные указатели вместо этого, так что вам не нужно беспокоиться об удалении чего-либо. Память будет освобождена, когда вы получите erase элемент с карты.

+3

Время, чтобы начать использовать повышение снова, то. Я выбрал другой ответ, хотя, знаете, он ответил на вопрос;) Спасибо. – natli

+0

@ natli справедливо, я бы сделал то же самое :). –

0
template<class T> 
    class Pointer 
    { 
     private: 
     T* pointer; 
     int* ref; 


    public: 
    Pointer():pointer(0), ref(0) 
    { 
    (*ref)++; 

    } 

    Pointer(T* value):pointer(value),reference(0) 
    { 
    (*ref)++; 

    } 

    Pointer(const pointer<T>& sp):pointer(sp.pointer),ref(sp.ref) 
    { 
     (*ref)++; 
    } 

    ~Pointer() 
    { 
    if(--(*ref)==0) 
    {delete pointer; 
     delete ref; 
    } 
    } 
    }; 

Есть некоторые операторы, такие как -> *, = что вам нужно переопределить.

+0

выглядит как переопределение умного указателя на меня. – hochl

+0

Достаточно безнадежная не-поточная безопасная повторная реализация. –

Смежные вопросы