std :: function如何工作

你知道,我们可以将一个lambda函数包装或存储到一个std::function

 #include <iostream> #include <functional> int main() { std::function<float (float, float)> add = [](float a, float b) // ^^^^^^^^^^^^^^^^^^^^ { return a + b; }; std::cout << add(1, 2) << std::endl; } 

我的问题是围绕std::function ,你可以看到它是一个模板类,但它可以接受任何types的函数签名

例如float (float, float)这种forms的return_value (first_arg, second_arg)

什么是std::function的结构,它是如何接受像x(y,z)这样的函数签名以及它如何工作的呢? float (float, float)在C ++中是一个新的有效expression式吗?

它使用一些types的删除技术 。

一种可能性是使用混合亚型多态性与模板。 这是一个简化的版本,只是为了给出一个整体结构的感觉:

 template <typename T> struct function; template <typename Result, typename... Args> struct function<Result(Args...)> { private: // this is the bit that will erase the actual type struct concept { virtual Result operator()(Args...) const = 0; }; // this template provides us derived classes from `concept` // that can store and invoke op() for any type template <typename T> struct model : concept { template <typename U> model(U&& u) : t(std::forward<U>(u)) {} Result operator()(Args... a) const override { t(std::forward<Args>(a)...); } T t; }; // this is the actual storage // note how the `model<?>` type is not used here std::unique_ptr<concept> fn; public: // construct a `model<T>`, but store it as a pointer to `concept` // this is where the erasure "happens" template <typename T, typename=typename std::enable_if< std::is_convertible< decltype( t(std::declval<Args>()...) ), Result >::value >::type> function(T&& t) : fn(new model<typename std::decay<T>::type>(std::forward<T>(t))) {} // do the virtual call Result operator()(Args... args) const { return (*fn)(std::forward<Args>(args)...); } }; 

(请注意,为了简单起见,我忽略了几件事情:它不能被复制,也可能是其他问题;不要在实际代码中使用此代码)