Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11-检测新操作员的方法[]_C++_Templates_C++11 - Fatal编程技术网

C++ C++;11-检测新操作员的方法[]

C++ C++;11-检测新操作员的方法[],c++,templates,c++11,C++,Templates,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 po

我正在尝试做类似这样的工作:

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();
  };
 };
struct holder{
功能破坏者;
模板
持有人(T)=删除;
模板
保持器(如果<是用new>指针创建的,则std::enable_){
销毁程序=[=]{删除指针;};
};
模板
holder(如果<是使用新[]>数组创建的,则std::enable_){
销毁程序=[=]{delete[]数组;};
};
虚拟持有人(){
破坏者();
};
};
在某种程度上,我可以简单地使
返回新的测试
返回=新测试[10]holder
的函数上的code>。但我发现它永远不会被视为数组,因为
操作符new[]
返回一个指针

有没有办法达到预期的效果


谢谢!:)

我知道的唯一方法是通过新的布局:

#包括
#包括
结构A
{
void*运算符新(标准::大小\u t n,void*ptr)
{

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

您是否正在尝试重新创建?
unique\u ptr p(new int);
p
超出范围时将调用
delete
。同样,
unique\u ptr p(new int[10]);
将调用
delete[]
。有点像,但是隐式检测到
。我的意思是,我理解这是一个特殊的用法示例,但是
main()
中的东西非常错误,让我不寒而栗。。。
#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];
}