2013-09-16 2 views
2

Я пытаюсь сделать что-то вроде этой работы:C++ 11 - способ обнаружения оператора новый []

struct holder { 
    std::function<void()> destroyer; 

    template<typename T> 
    holder(T) = delete; 

    template<typename T> 
    holder(std::enable_if< WAS CREATED WITH new > pointer) { 
    destroyer = [=] { delete pointer; }; 
    }; 

    template<typename T> 
    holder(std::enable_if< WAS CREATED WITH new[] > array) { 
    destroyer = [=] { delete[] array; }; 
    }; 

    virtual ~holder() { 
    destroyer(); 
    }; 
}; 

так, что я мог бы просто сделать return new test; и return = new test[10]; на функции, вернется holder. Но я выяснил, что он никогда не будет рассматриваться как массив, так как operator new[] возвращает указатель.

Есть ли способ достичь желаемого результата?

Спасибо! :)

+5

Вы пытаетесь изобрести ['unique_ptr'] (http://en.cppreference.com/w/cpp/memory/unique_ptr)? 'unique_ptr p (new int);' будет вызывать 'delete', когда' p' выходит за рамки. Аналогично, 'unique_ptr p (new int [10]);' будет вызывать 'delete []'. – Praetorian

+0

Kinda, но с неявным признаком '<тип шаблона>'. – paulotorrens

ответ

5

невозможно; используется или нет new или new[], не является частью информации типа указателя.

+0

Печально, но спасибо. – paulotorrens

0

Единственный способ я знаю, через места размещения нового:

#include <new> 
#include <iostream> 

struct A 
{ 
    void* operator new(std::size_t n, void* ptr) 
    { 
     std::cout << "operator new()\n"; 
     return ptr; 
    } 

    void* operator new[](std::size_t n, void* ptr) 
    { 
     std::cout << "operator new[]\n"; 
     return ptr; 
    } 
}; 

int main() 
{ 
    A* ptr; 
    new (ptr) A(); 
    new (ptr) A[5]; 
} 
+3

Я имею в виду, я понимаю, что это особый пример использования, но вещи внутри 'main()' настолько ужасно ошибочны, что это дает мне дрожь ... – lapk

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