2

我正在尝试做这样的事情:

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];holderoperator new[]

有什么方法可以达到预期的效果吗?

谢谢!:)

4

2 回答 2

5

是不可能的; new无论是否new[]使用都不是指针类型信息的一部分。

于 2013-09-17T00:48:09.307 回答
0

我知道的唯一方法是通过placement-new

#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];
}
于 2013-09-17T00:46:02.103 回答