向我显示了此代码
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()
内使用visit_tuple_impl
lambda的折叠表达式每次检查元组中的每个id时?引用答案:I wouldn't be surprised if it generates a lookup table that's O(1)
,但这似乎更像是一个猜测,因此我向大家提出了这个问题。
check_call()
是否在每次调用visit_tuple_impl
时检查元组内的每种类型?