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)); ... }
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...
EDIT:
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); }
DEMO
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With