gpt4 book ai didi

c++ - 如何在编译时通过模板列表 "iterate"?

转载 作者:太空狗 更新时间:2023-10-29 21:32:29 25 4
gpt4 key购买 nike

这是对 this answer 的后续问题的摘录.

给定以下“循环”技术

#pragma once
// loop.hpp

#include <type_traits>
#include <utility>

template<std::size_t... indices, class LoopBody>
void loop_impl(std::index_sequence<indices...>, LoopBody&& loop_body) {
(// C++17's fold expression
loop_body(std::integral_constant<std::size_t, indices>{}),
...
);
}

template<std::size_t N, class LoopBody>
void loop(std::integral_constant<std::size_t, N>, LoopBody&& loop_body) {
loop_impl(std::make_index_sequence<N>{}, std::forward<LoopBody>(loop_body));
}

可以像这样遍历类型列表:

#include <iostream>
#include <string_view>
#include <tuple>

#include "loop.hpp"

template<class T>
std::string_view inspect() {
return __PRETTY_FUNCTION__;
}

using Types = std::tuple<int, int, char, bool, double>;

int main() {
loop(std::tuple_size<Types>{}, [&] (auto i) {
using T = std::tuple_element_t<i, Types>;

std::cout << i << ": " << inspect<T>() << "\n";
});
}

...但是如何遍历模板列表?

最佳答案

使用 Boost.Mp11 ,第一个版本是:

static constexpr auto size = std::tuple_size_v<Types>;
mp_for_each<mp_iota_c<size>>([&] (auto i) {
/* ... */
});

通过模板执行此操作的方式基本相同:

using list = mp_list<mp_quote<std::tuple>, mp_quote<std::pair>>;
mp_for_each<list>([&](auto f){
// v is a tuple<int, char> the first time around and a pair<int, char>
// the second time around
mp_invoke_q<decltype(f), int, char> v;
});

当然你可以在正文中使用 f 做任何你想做的事,我只是调用它作为 mp_quote 的例子以及它与其余部分的集成程度Mp11.

关于c++ - 如何在编译时通过模板列表 "iterate"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55090524/

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