模板方法中可调用对象的最佳类型是什么?

每次我写一个接受模板可调用的签名时,我总是想知道参数的最佳类型是什么。应该是值类型还是const引用类型?

例如,

template <class Func>
void execute_func(Func func) {
    /* ... */
}

// vs.

template <class Func>
void execute_func(const Func& func) {
    /* ... */
}

在任何情况下,可调用项大于64位(也就是指向func的指针)吗?也许std::function的行为有所不同?

piaozhea 回答:模板方法中可调用对象的最佳类型是什么?

  

在任何情况下可调用大于64位

根据我在CAD / CAE应用程序方面的经验,很多。函子可以轻松保存大于64位的数据。在Visual Studio中,您需要超过两个int,一个double,一个指针,就可以超过该限制。

,

通常,我不喜欢通过const引用传递callable对象,因为它不那么灵活(例如,不能在可变lambda上使用)。我建议按价值传递它们。如果您检查stl算法的实现(例如,对于std::for_each),所有可调用对象也会按值传递。

这样做,用户仍然可以根据需要使用std::ref(func)std::cref(func)来避免不必要地复制可调用对象(使用reference_wrapper)。

,

没有最佳类型。如果您有不可复制的函子怎么办?第一个模板将不起作用,因为它将尝试使用已删除的副本构造函数。您必须移动它,但随后您将失去(可能)该对象的所有权。这完全取决于预期用途。是的,std :: function可以比size_t大得多。如果绑定成员函数,则它已经是2个字(对象指针和函数指针)。如果绑定一些参数,它可能会进一步扩大。 lambda也是如此,每个捕获的值都存储在lambda中,在这种情况下,lambda实际上是一个函子。如果您的可调用对象具有非const运算符,则const引用将不起作用。它们都不适合所有用途。有时最好的选择是提供一些不同版本,以便您处理所有情况,SFINAE是您的朋友。

本文链接:https://www.f2er.com/3105411.html

大家都在问