这样的事情可能会有所帮助:
template <typename T>
class HeapWrapper
{
#ifdef USE_STACK
T obj_;
#else
T *obj_;
#endif
public:
#ifdef USE_STACK
HeapWrapper() : obj_() {}
#else
HeapWrapper() : obj_(new T()) {}
#endif
#ifdef USE_STACK
const T& obj() const
{ return obj_; }
T& obj() const
{ return obj_; }
#else
const T& obj() const
{ return *obj_; }
T& obj() const
{ return *obj_; }
#endif
};
但是,请注意,这要么将您限制为仅具有默认构造函数的对象。包装类可以提供一个函数,该函数可以由包装类的可变参数模板函数Init(...)
转发(或者只需为您需要的每个参数添加一个):template <typename T1, template T2, [etc]> Init(const T1 &x1, cons tT2 &x2)
template <typename T1>
void Init(const T1& x1)
{
#ifdef USE_STACK
obj_.Init(x1);
#else
obj_->Init(x1);
#endif
}
template <typename T1, typename T2>
void Init(const T1& x1, const T2& x2)
{
#ifdef USE_STACK
obj_.Init(x1, x2);
#else
obj_->Init(x1, x2);
#endif
}
如果您的编译器已经有可变参数模板,则加分:
template<typename... T>
void foo(const T&... values) {
#ifdef USE_STACK
obj_.Init(values...);
#else
obj_->Init(values...);
#endif
}