Arduino 没有std::function
,因为 AVR GCC 不附带标准库,因此评论中的这些建议不适用于该特定平台。
如果您需要 Arduino 或其他嵌入式平台的类似行为,您可以使用ETL或etl::function
,etl::delegate
或创建您自己的实现。std::function
使用堆分配进行类型擦除,这通常不是嵌入式的好选择。
最简单的实现将使用 C 风格的函数指针:
// Generic definition of the function type
template <typename F>
class function;
// R: return type
// Args: Any arguments a function can take
template <typename R, typename... Args>
class function<R(Args...)> {
public:
// Type definition of the equivalent C function pointer
using function_type = R (*)(Args...);
// Default constructor: empty function.
// Never call the function while not initialized if using it this way.
function() = default;
// Constructor: store the function pointer
function(function_type f) : function_ptr(f){};
// Call operator: calls the function object like a normal function
// PS: This version does not do perfect forwarding.
R operator()(Args... args) { return function_ptr(args...); }
private:
function_type function_ptr;
};
// A helper function can be used to infer types!
template <typename R, typename... Args>
function<R(Args...)> make_function(R (*f)(Args...)) {
return {f};
}
活生生的例子,有一些用例。
当然,这种情况下也可以只使用 C 指针,但是这个类可以扩展为其他类型。如果您需要更复杂的行为,例如仿函数、成员函数和捕获 lambda,请参阅我上面引用的 ETL 实现。