gpt4 book ai didi

c++ - 调用包含可调用对象和参数的元组

转载 作者:行者123 更新时间:2023-12-05 08:36:04 25 4
gpt4 key购买 nike

我试图调用一个元组中的第一个参数,第二个参数作为参数,但不知道该怎么做。

例子:

#include <tuple>
#include <functional>

struct S {
void operator()(int) {}
};

int main() {
S s;
auto t = std::make_tuple(s, 3);
std::invoke(s, 3);
// std::apply(std::invoke, t); // This is what I want to do
// std::apply(std::invoke<S, int>, t); // I would settle for this "Good Enough"
}

但上面的代码无法编译,而且错误对我来说毫无帮助:

error: no matching function for call to '__invoke(void (&)(S&&, int&&), std::__tuple_element_t<0, std::tuple<S, int> >&, std::__tuple_element_t<1, std::tuple<S, int> >&)'

(这是来自“足够好”的尝试)

任何人都知道如何做到这一点,或者如果不能做到这一点?

最佳答案

在 lambda 中包装重载/模板函数解决了很多问题:

std::apply([](auto&&... args){ std::invoke(args...); }, t);

可能与转发:

std::invoke(std::forward<decltype(args)>(args)...);

否则为 std::invoke 是一个模板函数(转发引用),你需要更正类型:

std::apply(std::invoke<S&, int&>, t);
std::apply(std::invoke<S, int>, std::move(t));

Demo

关于错误阅读:std::__tuple_element_t<0, std::tuple<S, int> >&S& , 所以错误简化为

error: no matching function for call to __invoke(void (&)(S&&, int&&), S&, int&)"

你需要 void (&)(S&, int&) (或传递 S&& , int&& 作为函数的参数)

关于c++ - 调用包含可调用对象和参数的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70928047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com