Cla*_*diu 3 c++ templates const
我有类似的东西:
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); }
Run Code Online (Sandbox Code Playgroud)
有些人Foob
需要const T&
s而其他人Foob
只需要T&
s,或者同样Foob
可能有两个proc
s,一个用于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); }
Run Code Online (Sandbox Code Playgroud)
Bri*_*ian 10
实际上如果t
参数总是左值,那么你只需要第一次重载!如果左值有类型const U
,则模板参数T
被推导为const U
,并且实例化函数的第二个参数类型将是const U&
,它将很好地绑定到const左值.
仅当参数是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)); }
Run Code Online (Sandbox Code Playgroud)