繁体   English   中英

当唯一的区别是参数的常量时,是否可以将两个模板函数编写为一个?

[英]Is it possible to write two template functions as one when the only difference is the const-ness of an argument?

我有类似的东西:

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& s而其他Foob采用T& s,或者相同的Foob甚至可以有两个proc ,一个用于const case,一个用于非const case,用于做不同的事情。

但是, 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& ,它将很好地绑定到const lvalue。

仅当参数是rvalue时才需要第二个重载。 但是,为什么不使用完美转发,而不是将其作为特殊情况?

// 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)); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM