在成员函数中访问 class 个模板参数

Access class template arguments in member function

我想要一个 HandlerGroup,它可以包装一堆处理程序以备后用。这是我设计的 API:

void handler1(Data* d) {}
void handler2(Data* d) {}
void handler3(Data* d) {}

using Handler = std::function<void(Data*)>;

template <typename... Handlers>
struct HandlerGroup {
    void run(Data* data) {
    // ??? how to access variadic handlers defined in template arguments
    // for (handler : Handlers...) handler(data);
    }
}

void driver(Data* data) {
    HandlerGroup<handler1, handler2, handler3>::run(data);
}

从 C++17 开始,您应该使用 auto... 作为模板参数,这样您就可以使用传递的函数指针实例化您的模板。

然后你可以创建基于范围的 for 循环初始值设定项列表,解压缩 Handler(functionPointer),然后调用 function 包装器:

using Handler = std::function<void(Data*)>;

template <auto... Handlers>
struct HandlerGroup {
    static void run(Data* data) {
        for (const auto& handler :  {Handler(Handlers)...})
            handler(data);
    }
};

void driver(Data* data) 
{
    HandlerGroup<handler1, handler2, handler3>::run(data);
}

Demo