C ++ 11方法在运行时索引元组,而不使用开关 [英] C++11 way to index tuple at runtime without using switch
问题描述
我有一块类似如下的c ++ 11代码:
I have a piece of c++11 code similar like below:
switch(var) {
case 1: dosomething(std::get<1>(tuple));
case 2: dosomething(std::get<2>(tuple));
...
}
有任何方法来删除此大型开关?请注意, get< var>
不起作用,因为var不是常数,但我知道var在小范围ie(0-20)。
Is there any way to remove this large switch ? Note that get<var>
does not work because var is not constant, but I know var is in small range i.e. (0-20).
请注意,这里的要点是避免使用导致数组查找的数组...
Note that the point here is to avoid using an array that causes an array lookup...
编辑:
在性能问题上,有一个讨论
函数数组在if和switch语句上的性能
well on the issue of performance, there is a discussion Performance of array of functions over if and switch statements
为了我自己的目的,我不争论
For my own purpose, I do not argue which one is better.
推荐答案
这里有一个不使用索引序列的版本:
Here's a version that doesn't use an index sequence:
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);
}
这篇关于C ++ 11方法在运行时索引元组,而不使用开关的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!