C ++:使用std :: apply遍历两部分遍历一个元组:向上使用lambda的索引,然后在索引中使用不同的lambda

问题描述

如果我想使用std::apply遍历一个元组但不将一个函数应用于整个对象,那么我该如何分隔该元组,即将一个函数应用于第一个n值,将另一个函数应用于之后的所有值?

some_values将是一个元组,可以具有任何长度和类型,并且length_of_first_part(可能更详细些)在编译时就知道了。

std::tuple<char,long long,double,long double,float> some_values(33,2,3.4,5.6,7.8);
const size_t length_of_first_part = 2;
std::apply(
    [](auto&&... current_val) {
        ((std::cout << "(Should be first part) " << current_val << "\n"),...); //Would obviously do a litle more than cout,but this is just a minimal example
    },some_values
);

std::apply(
    [](auto&&... current_val) {
        ((std::cout << "(Should be second part) " << current_val << "\n"),...);
    },some_values
);

解决方法

试一下。在这里查看“可能的实现”: https://en.cppreference.com/w/cpp/utility/apply

它将post: consumes: - "application/json" tags: - "abc" summary: "Login" description: "Used for login" operationId: "Login" produces: - "application/json" parameters: - in: "body" name: "Data" description: "login Object" required: true schema: $ref: "#/definitions/abc" required: - username - password responses: "201": description: Operation Successful "400": description: Validation Failed x-swagger-router-controller: "test" deprecated: false security: - Bearer: [] 传递给帮助函数以调用std::index_sequence。我将其更改为通过std::invoke(N为拆分索引)而不是元组大小。然后,我传递了逆数(元组大小-N)以在​​第二个函数上调用std::make_sequence<N>

std::invoke

用法:

template <int N,typename F1,typename F2,typename Tuple,size_t... I1s,size_t... I2s>
decltype(auto) split_apply_impl(F1&& f1,F2&& f2,Tuple&& t,std::index_sequence<I1s...>,std::index_sequence<I2s...>) {
    std::invoke(std::forward<F1>(f1),std::get<I1s>(std::forward<Tuple>(t))...);
    return std::invoke(std::forward<F2>(f2),std::get<(I2s+N)>(std::forward<Tuple>(t))...);
}

template <size_t N,typename Tuple>
decltype(auto) split_apply(F1&& f1,Tuple&& t)
{
    return split_apply_impl<N>(
        std::forward<F1>(f1),std::forward<F2>(f2),std::forward<Tuple>(t),std::make_index_sequence<N>{},std::make_index_sequence<(std::tuple_size_v<std::remove_reference_t<Tuple>>-N)>{});
}

概念证明: https://godbolt.org/z/6dvMre

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...