[英]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.