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

それは無理だ; 使用されたかどうかnewnew[]、ポインターの型情報の一部ではありません。

于 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 に答える