是否有一个技巧可以使模板函数在堆栈或堆中返回对象?
template <class Type>
Type ReturnAbstract(int a) {
return Type(a);
}
template <class Type>
Type* ReturnAbstract(int a) {
return new Type(a);
}
那么,有一个技巧可以用单个模板支持两种返回类型吗?
答案 0 :(得分:4)
将constexpr if
与占位符返回类型结合使用,我们可以拥有调用者控件堆栈或堆
template <class Type, bool OnHeap=false>
auto ReturnAbstract(int a) {
if constexpr (OnHeap)
return new Type(a);
else
return Type(a);
}
用法:
int main(){
auto on_stack = ReturnAbstract<int, false>(1);
auto on_heap = ReturnAbstract<int, true>(2);
std::cout << on_stack << std::endl;
std::cout << *on_heap << std::endl;
delete on_heap;
}
编辑:正如Quentin指出的那样,像这样的原始指针在现代C ++上并不是一个好主意。
您可以使用unique_ptr仍然在堆上分配,但是以安全的方式:
template <class Type, bool OnHeap=false>
auto ReturnAbstract(int a) {
if constexpr (OnHeap)
return std::make_unique<Type>(a);
else
return Type(a);
}