假设有一个像
这样的函数template <typename ...ts>
void f(std::tuple<ts...> & data);
我想生成一个
std::tuple
的std::function
,每个都有这个签名:std::function<void(t&)>
,其中t
是data
中对应的类型。
类似:
template <typename ...ts>
void f(std::tuple<ts...> & data, std::tuple<std::function<void(ts)>, ...> functions);
我想以某种方式在
std::index_sequence
上使用ts...
,但我无法弄清楚。
正如评论中提到的,您可以像这样表达包扩展:
template <typename... Ts>
void f(std::tuple<Ts...> & data, std::tuple<std::function<void(Ts &)>...> functions);
不过,我认为要求每个元素都是
std::function
是相当昂贵的。也许你想要更像这样的东西:(c++20)
template <typename... Ts, typename... Fs>
requires (... and std::is_invocable_r_v<void, Fs, Ts &>)
void f(std::tuple<Ts...> & data, std::tuple<Fs...> functions);
或者这个:(c++17)
template <typename... Ts, typename... Fs>
std::enable_if_t<std::conjunction_v<std::is_invocable_r<void, Fs, Ts &>...>>
f(std::tuple<Ts...> & data, std::tuple<Fs...> functions);