将参数传递给模板函数的方法

时间:2019-04-08 22:11:33

标签: c++ c++11 templates c++17

假设我具有模板功能

template <typename T>
void do_sth(T const&);

对于某些类型(“小”和可复制),最好通过值而不是引用传递参数。

所以我的问题是:根据底层类型重载函数的最简单方法是什么?

备注: 最好的结果是在某些“简单”类型的条件下使用enable_if。而且我相信标准库中没有“简单类型”这样的类型特征。如果我错了纠正我。此外:由于功能enable_if需要更多的模板参数(已编辑),因此使用template <typename T, typename U> void do_sth(T, U)变得很复杂,因为// numeric input field from the view <input class="form-control" type="number" step="0.01" data-number-to-fixed="2" placeholder="0.00" (change)="onRecordUpdated(timeCard, timecarddet)" name="hoursWorked" id="hoursWorked" [(ngModel)]="timecarddet.hours" min="0" max="365" #hoursWorked> 将需要4个重载:(值,值),(值,引用), (参考值)和(参考值)。

2 个答案:

答案 0 :(得分:1)

boost有call_traits

template <typename T>
void do_sth(typename boost::call_traits<T>::param_type)

但是一个大问题是T不再是可推论的
(因此您必须将其称为do_sth<int>(42)do_sth<MyBigObj>(myBigObj))。

因此可能用于模板类中的非模板方法:

template <typename T>
struct S
{
    void do_sth(typename boost::call_traits<T>::param_type);
};

但是无论如何,编译器实际上可能内联代码,导致生成的代码相同。

答案 1 :(得分:1)

不要这样做。内联模板函数时要插上帽子,一旦内联函数,对x的引用就是没有身份的别名。

除非您证明这是一个重要的瓶颈,否则鼓励内联函数,而不要弄乱SFINAE。

在发现此功能所花费的时间比您可以优化的其他任何东西都要多之后,请通过在几个关键情况下手动编写按值版本来测试它的改进,以确保您确实获得了好处(我怀疑您会这样做)。 / p>