gpt4 book ai didi

c++ - 当唯一的区别是参数的常量性时,是否可以将两个模板函数写成一个?

转载 作者:太空狗 更新时间:2023-10-29 19:52:11 25 4
gpt4 key购买 nike

我有这样的东西:

template <class Foob, class T>
void do_it(Foob& f, T& t) { f.proc(t); }

template <class Foob, class T>
void do_it(Foob& f, const T& t) { f.proc(t); }

一些 Foob 接受 const T& 而其他 Foob 只接受 T&,或者相同Foob 甚至可能有两个 proc,一个用于 const 情况,一个用于非 const 情况,做不同的事情。

但是,do_it 的代码是相同的:只是f.proc(t)。有时代码很多行,但仍然相同。有什么方法可以将 do_it 写成一个函数吗?像这样的东西,虽然这显然行不通:

template <class Foob, class MaybeConst, class T>
void do_it(Foob& f, MaybeConst T& t) { f.proc(t); }

最佳答案

实际上,如果 t 参数始终是左值,那么您只需要第一个重载!如果左值的类型为 const U,则模板参数 T 被推导出为 const U 并且实例化函数的第二个参数类型将为 const U&,它将很好地绑定(bind)到 const 左值。

只有当参数是右值时才需要第二个重载。但与其将其作为特例,不如使用完美转发?

// works for both lvalues and rvalues with any cv-qualification
template <class Foob, class T>
void do_it(Foob& f, T&& t) { f.proc(std::forward<T>(t)); }

关于c++ - 当唯一的区别是参数的常量性时,是否可以将两个模板函数写成一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30062390/

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