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

时间:2015-05-05 20:12:46

标签: 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); }

有些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;

1 个答案:

答案 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)); }