gpt4 book ai didi

C++ 11在运行时索引元组而不使用开关的方法

转载 作者:IT老高 更新时间:2023-10-28 12:42:52 24 4
gpt4 key购买 nike

我有一段类似如下的 c++11 代码:

switch(var) {
case 1: dosomething(std::get<1>(tuple));
case 2: dosomething(std::get<2>(tuple));
...
}

有什么办法可以去掉这个大开关吗?请注意 get<var>不起作用,因为 var 不是常数,但我知道 var 在小范围内,即 (0-20)。

注意这里的重点是避免使用导致数组查找的数组...

编辑:

关于性能的问题,有讨论 Performance of array of functions over if and switch statements

出于我自己的目的,我不争论哪个更好。

最佳答案

这是一个不使用索引序列的版本:

template <size_t I>
struct visit_impl
{
template <typename T, typename F>
static void visit(T& tup, size_t idx, F fun)
{
if (idx == I - 1) fun(std::get<I - 1>(tup));
else visit_impl<I - 1>::visit(tup, idx, fun);
}
};

template <>
struct visit_impl<0>
{
template <typename T, typename F>
static void visit(T& tup, size_t idx, F fun) { assert(false); }
};

template <typename F, typename... Ts>
void visit_at(std::tuple<Ts...> const& tup, size_t idx, F fun)
{
visit_impl<sizeof...(Ts)>::visit(tup, idx, fun);
}

template <typename F, typename... Ts>
void visit_at(std::tuple<Ts...>& tup, size_t idx, F fun)
{
visit_impl<sizeof...(Ts)>::visit(tup, idx, fun);
}

DEMO

关于C++ 11在运行时索引元组而不使用开关的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28997271/

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