以这种方式在运行时访问元组的性能成本

问题描述 投票:2回答:1

向我显示了此代码

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时检查元组内的每种类型?

c++
1个回答
0
投票
是的,这正是模板将扩展到的内容。用很多话来说,这就是模板扩展的直接字面结果。但是,不管事实是否如此,这将是一个完全不同的故事。
© www.soinside.com 2019 - 2024. All rights reserved.