我看到了这段代码
template<typename F, typename ... Ts, std::size_t... Is>
void visit_tuple_impl(std::tuple<Ts...>& tup, F&&f,
std::index_sequence<Is...>, std::size_t idx) {
auto check_call = [&](auto & elem, std::size_t I) {
if (I == idx)
f(elem);
};
(check_call(std::get<Is>(tup), Is), ...);
}
template<typename F, typename ... Ts>
void visit_tuple(std::tuple<Ts...>& tup, std::size_t idx, F&& f) {
using TT = std::decay_t<decltype(tup)>;
constexpr std::size_t size = std::tuple_size_v<TT>;
auto idxs = std::make_index_sequence<size> {};
visit_tuple_impl(tup, std::forward<F>(f), idxs, idx);
}
void printComponents(uInt vectorId) {
visit_tuple(data, vectorId, [&](auto &vec) {
for(auto &elem : vec) {
elem.print();
std::cout << ' ';
}
std::cout << '\n';
});
}
用法是这样的:
int vecId = 1;
ecsData.printComponents(vecId);
这意味着给定一个运行时变量id
,元组中的每个类型都可以在运行时在 for 循环中使用它来访问,而不是简单地使用std::get<2>()
不接受运行时变量作为模板参数的类型。所以我的问题是“使用check_call()
lambda的折叠表达式不是visit_tuple_impl
每次被调用时都会检查元组中的每个 id 吗?引用答案:I wouldn't be surprised if it generates a lookup table that's O(1)
,但这似乎更像是一个猜测,所以我向你提出这个问题伙计们。
check_call()
每次调用都检查元组中的每种类型吗visit_tuple_impl
?