在成员函数中访问 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);
}
我想要一个 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);
}