每当我编写一个接受模板可调用的签名时,我总是想知道参数的最佳类型是什么。它应该是值类型还是const引用类型?
例如,
template <class Func>
void execute_func(Func func) {
/* ... */
}
// vs.
template <class Func>
void execute_func(const Func& func) {
/* ... */
}
是否存在可调用大于64位(又称指向func的指针)的情况?也许std::function
表现不同?
通常,我不喜欢通过callable
const引用传递对象,因为它不那么灵活(例如,不能在可变lambda上使用)。我建议按价值传递它们。如果检查stl算法的实现(例如std::for_each
),那么所有可调用对象也会按值传递。
这样,如果需要,用户仍然可以使用std::ref(func)
或std::cref(func)
避免不必要地复制可调用对象(使用reference_wrapper
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句