有没有办法扩展和调用std::functions的元组?

Is there a way to expand and call a tuple of std::functions?

我有一个包含函数元组的 class,它们的 return 类型由 class 的模板确定:

template <typename... Ts>
class A{
    static inline auto funcs = std::make_tuple(std::function<Ts()>()...)
};

我希望能够迭代这些函数。我尝试使用此答案中的方法从模板中获取每种类型的索引:

std::get<Index<Ts,Ts...>::value>(funcs)()...;

但是这段代码无法编译。它抱怨最后的“...”,可能是因为当我键入 "T..." 时模板参数包已经展开,但我不明白为什么它不让我展开另一个 [=21] =].有办法吗?

您必须删除 funcs 作业中的 {} 否则这将创建一个 initializer_list 而不是 tuple

static inline auto funcs = std::make_tuple(std::function<Ts()>()...);

然后您可以在 std::apply 和通用可变参数 lambda 的帮助下调用每个元组函数:

auto call = [](auto&&...funcs) {
    (funcs(),...);
};

int main()
{
    A<int, float, char> l;
    std::get<0>(l.funcs) = []() { cout << "Calling int()" << endl; return 1; };
    std::get<1>(l.funcs) = []() { cout << "Calling float()" << endl; return 1.f; };
    std::get<2>(l.funcs) = []() { cout << "Calling char()" << endl; return '1'; };

    std::apply(call, l.funcs);
    return 0;
}

查看实例:https://onlinegdb.com/HJfQ95TpS