通过可变参数模板调用函数指针作为模板参数

Call function pointers via variadic template as template argument

本文关键字:参数 指针 函数 调用 变参      更新时间:2023-10-16

我想通过模板(而不是通过函数)将函数(在编译时之前已知)传递给类。在类中,我想彼此调用这些函数。函数始终具有相同的类型(在本例中返回 void 并且不传递任何参数)。稍后我想传递这样的函数:void foo(uint16_t arg);我已经尝试了两件事,但找不到解决方案。

typedef void(*decodeFunct)(void);
template <uint8_t pin, decodeFunct... functions>
class CIRLremote{
public:
    CIRLremote(void){
        // empty
    }
    void begin(void){
        // call all decode functions
        //functions... ();
        call(functions...);
    }
    void call(decodeFunct f){
        f();
    }
};

您可以轻松编写一个函数,通过始终调用其第一个参数并使用其余参数递归调用自身来调用其所有参数。空参数列表的重载为递归提供了锚点:

#include <utility>
inline void call() { }
template<typename T, typename... V>
inline void call(T&& t, V&&... v) { t(); call(std::forward<V>(v)...); }

如果您完全按照您的示例来调用它,它将起作用。

请注意,参数类型不是固定的,因此您可以使用任何函子(而不仅仅是函数指针)调用它。

修改它以适应任何类似的用例(例如,分发一个参数,每个函子传递一个参数,聚合结果等)非常简单。