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];
}