模板,以适应指针和非指针

时间:2018-03-19 14:34:54

标签: c++ templates

是否有一个技巧可以使模板函数在堆栈或堆中返回对象

template <class Type>
Type ReturnAbstract(int a) {
  return Type(a);
}

template <class Type>
Type* ReturnAbstract(int a) {
  return new Type(a);
}

那么,有一个技巧可以用单个模板支持两种返回类型吗?

1 个答案:

答案 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;
}

Demo

编辑:正如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);
}

Demo 2