从可变参数模板生成 std::function 的 std::tuple

问题描述 投票:0回答:1

假设有一个像

这样的函数
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...
,但我无法弄清楚。

c++ metaprogramming variadic-templates variadic-functions stdtuple
1个回答
0
投票

正如评论中提到的,您可以像这样表达包扩展:

template <typename... Ts>
void f(std::tuple<Ts...> & data, std::tuple<std::function<void(Ts &)>...> functions);

不过,我认为要求每个元素都是

std::function
是相当昂贵的。也许你想要更像这样的东西:()

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);

或者这个:()

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);

如果需要,从 方法导出 或更低版本的解决方案应该非常简单。

© www.soinside.com 2019 - 2024. All rights reserved.