如何决定模板方法的值和引用

How do you decide on value vs reference for template methods

本文关键字:引用 模板方法 何决定 决定      更新时间:2023-10-16

如果我有一个像

这样的模板函数
template<typename T>
void doSomething(const T arg) {.....}

,我不知道如果T是一个简单的int或如果它是一个巨大的结构体。如果是int型,则按值传递是有意义的,而结构体则应按引用传递。

如何设计一个具有两种类型参数的模板函数?

boost::call_traits库有几个类似的帮助程序。特别是call_traits<T>::param_type

定义了一个类型,该类型表示将类型T的形参传递给函数的"最佳"方式。

你可以这样使用:

template<typename T>
void doSomething(typename boost::call_traits<T>::param_type arg) {.....}

它的基本工作原理是为特殊情况对类进行专门化。因此,例如,问题中的int案例(间接地)专门针对int(而不是int &)。

你的问题是XY问题。你是在要求一个问题的解决方案,而这个问题只会从另一个问题的糟糕"解决方案"中产生。所以,在这里我决定回答你最初的问题。

因为你的模板函数几乎肯定必须是inline,大多数编译器将优化函数调用,并与它的问题。因此,实际上您使用什么并不重要,但T const&arg是更保守的。

所以,在"解决"这个问题之前,你应该测试一个简单的int的两个选项之间是否有任何可测量的差异(与生产风格的优化开关)。