我有类似的东西:
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
} s,一个用于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); }
写成一个函数?像这样的东西,虽然这显然不起作用:
SELECT name AS 'Name',
CONCAT(
'Fail: ',
CAST(SUM(CASE WHEN (grade1+grade2+grade3)/3 <= 65 THEN 1 ELSE 0 END) AS CHAR(20)),
' Success: ',
CAST(SUM(CASE WHEN (grade1+grade2+grade3)/3 > 65 THEN 1 ELSE 0 END) AS CHAR(20))) AS 'Report',
NOW() AS 'Report date'
FROM grade_table gt1
WHERE (SELECT COUNT(*)
FROM grade_table
WHERE name = gt1.name
AND gradedate > gt1.gradedate
ORDER BY gradedate ASC) < 7
GROUP BY name;
答案 0 :(得分:10)
实际上,如果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)); }