Skip to content

第四章 std::tuple 的遍历的内容有些过时与复杂 #294

Open
@Mq-b

Description

@Mq-b

现在基本上来说谈起遍历元组,无非就是多套一层,然后 std::index_sequence + std::make_index_sequence 解决。

标准高的话用 C++17 折叠表达式,或者 C++20 引入的lambda显式写明模板参数,也就是:

template<typename Func, typename... Args>
void iterate_tuple(Func f, const std::tuple<Args...>& tuple) {
    [&]<std::size_t... idx>(std::index_sequence<idx...>){
        (f(std::get<idx>(tuple)), ...);
    }(std::make_index_sequence<sizeof...(Args)>());
}

int main(){
    auto print = [](const auto& v){
        std::cout << v << ' ';
    };
    std::tuple<int, double, std::string> tuple{ 1,1.2,"😅" };
    iterate_tuple(print, tuple);
}

非常的简单直观,godbolt

原文使用的 std::variant 让我觉得很诡异。

https://changkun.de/modern-cpp/zh-cn/04-containers/#%E8%BF%90%E8%A1%8C%E6%9C%9F%E7%B4%A2%E5%BC%95

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions