<分区>
我正在开发一个小型图书馆,其中我对任何 X 类
都有以下要求:
class X
必须只能使用operator new
进行分配
X 类
的所有子级都应该隐式变为可分配的 仅由operator new
- 堆分配的语法应该优雅
- 无需更改太多现有代码即可将其合并
- 一段时间后,如果我想让
class X
可分配 作为自动;同样不需要更改太多代码
我也欢迎 C++0x 解决方案(仅供将来使用)。
[注意:我已经完成了我的部分研究并将其作为答案发布(针对基本场景进行了测试)]
<分区>
我正在开发一个小型图书馆,其中我对任何 X 类
都有以下要求:
class X
必须只能使用 operator new
X 类
的所有子级都应该隐式变为可分配的
仅由 operator new
class X
可分配
作为自动;同样不需要更改太多代码我也欢迎 C++0x 解决方案(仅供将来使用)。
[注意:我已经完成了我的部分研究并将其作为答案发布(针对基本场景进行了测试)]
最佳答案
// Dynamic.h
class OnlyDynamic
{
template<class T> friend struct Dynamic;
virtual void*** __Restriction () = 0;
};
template<class T>
class Dynamic : public T
{
virtual void*** __Restriction () { return 0; }
~Dynamic();
public:
#ifdef Cpp0x
template<typename... Args>
Dynamic(Args... args) : T(args...) {}
#else
Dynamic () {}
template<typename A1> Dynamic(const A1 &a1) : T(a1) {}
template<typename A1, typename A2> Dynamic(const A1 &a1, const A2 &a2) : T(a1,a2) {}
//...
template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
Dynamic(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6) : T(a1,a2,a3,a4,a5,a6) {}
#endif
};
用法:
假设,我想制作 class X
只能动态分配;我应该简单地导出 OnlyDynamic
(访问说明符无关紧要)并分配 new Dynamic<X>()
.
例子:
class Base {};
struct A : Base, OnlyDynamic // <-- only inherit
{
A (int i) {}
};
A *p = new Dynamic<A>(3);
delete p;
截至目前,我发现此解决方案已满足所有给定要求。
关于c++ - 允许仅使用动态分配来分配对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7049204/