Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++11 way to index tuple at runtime without using switch

Tags:

c++

c++11

tuples

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.

like image 293
w00d Avatar asked Mar 11 '15 21:03

w00d


1 Answers

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

like image 198
Oktalist Avatar answered Oct 17 '22 01:10

Oktalist