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

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可能有两个procs,一个用于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)