我有一段类似下面的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++ - C++ 11在运行时索引元组而无需使用开关的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28997271/