gpt4 book ai didi

c++ - C/C++ 模式到 USE_HEAP 或 USE_STACK

转载 作者:太空狗 更新时间:2023-10-29 19:55:49 26 4
gpt4 key购买 nike

有没有一种方法可以定义一个宏(或类似的东西)来允许在堆栈或堆上干净地分配对象?

例如。当前代码:

A a;
a.someFunc();

最简单的建议可能如下所示,但正如您在下面看到的那样,维护 2 套代码并不是很干净。

#ifdef USE_STACK
A a;
a.someFunc();
#elseif USE_HEAP
A* a = new A();
a->someFunc();
#endif

我正在寻找可用于以任何一种方式编译代码的设计模式/代理类,具体取决于我们客户的需求。

编辑:该代码用于为嵌入式设备/(嵌入式)Linux/Windows Mobile 构建库。大多数客户只需要基于堆栈的分配。其他一些人要求用堆栈交换堆。

谢谢,查尔斯

最佳答案

编辑:改进为允许通过operator->

调用包装的成员函数

扩展 Manuel 的答案以使其更完整,试试这个:

#include <iostream>

#define USE_STACK

template <class T>
class HeapWrapper {
#ifdef USE_STACK
T obj_;
#else
T *obj_;
#endif
public:
#ifdef USE_STACK
HeapWrapper() : obj_() {}

template <class A1>
HeapWrapper(const A1 &a1) : obj_(a1) {}

template <class A1, class A2>
HeapWrapper(const A1 &a1, const A2 &a2) : obj_(a1, a2) {}

// etc

#else
HeapWrapper() : obj_(new T()) {}
~HeapWrapper() { delete obj_; }

template <class A1>
HeapWrapper(const A1 &a1) : obj_(new T(a1)) {}

template <class A1, class A2>
HeapWrapper(const A1 &a1, const A2 &a2) : obj_(new T(a1, a2)) {}

// etc
#endif

#ifdef USE_STACK
operator const T &() const { return obj_; }
operator T &() { return obj_; }
T *operator->() { return &obj_; }
T& operator*() { return obj_; }
#else
operator const T &() const { return *obj_; }
operator T &() { return *obj_; }
T *operator->() { return obj_; }
T& operator*() { return *obj_; }
#endif

// cast operators makes this work nicely
HeapWrapper &operator=(const T &rhs) { *obj_ = rhs; return *this;}
};


class A {
public:
void member(int x) {
std::cout << x << std::endl;
}
};


int main() {
HeapWrapper<int> x1(5);
HeapWrapper<int> x2;
HeapWrapper<int> x3 = x1;
HeapWrapper<int> x4 = 3;

std::cout << x1 << " " << x2 << " " << x3 << " " << x4 << std::endl;

// example using a custom class's members..
HeapWrapper<A> a1;
a1->member(5);
}

关于c++ - C/C++ 模式到 USE_HEAP 或 USE_STACK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/736061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com