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

时间:2015-04-21 19:05:42

标签: c++ variadic-templates

我想通过模板(不是通过函数)将函数(在编译时之前已知)传递给类。在课堂上,我想在彼此之后调用这些函数。函数总是具有相同的类型(在这种情况下返回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();
    }
};

1 个答案:

答案 0 :(得分:0)

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

#include <utility>

inline void call() { }

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

如果你完全像你的例子那样打电话,它就会起作用。

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

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