【问题标题】:Call function pointers via variadic template as template argument通过可变参数模板调用函数指针作为模板参数
【发布时间】:2015-06-29 03:10:52
【问题描述】:

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

【问题讨论】:

    标签: c++ variadic-templates


    【解决方案1】:

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

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

    如果您完全按照示例的方式调用它,它将正常工作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2013-04-30
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多