Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Compile-time integer sequences

Use case

Unpack tuple of segment info into function arguments.

Explanation

std::index_sequence and std::make_index_sequence<N> generate compile-time sequences 0, 1, 2, ..., N-1. Use with parameter pack expansion to unpack tuples or iterate arrays at compile-time.

Code

#include <cstdint>
#include <iostream>
#include <tuple>
#include <utility>

void printSegment(const char *name, uint64_t addr, uint64_t size) {
  std::cout << name << " @ 0x" << std::hex << addr << " (size: 0x" << size
            << ")\n";
}

// Step 2: I... is 0, 1, 2 for a tuple with 3 elements.
template <typename Tuple, std::size_t... I>
void callImpl(Tuple &&t, std::index_sequence<I...>) {
  // std::get<I>(t) expands to: std::get<0>(t), std::get<1>(t), std::get<2>(t).
  printSegment(std::get<I>(std::forward<Tuple>(t))...);
}

// Step 1: create index sequence from tuple size.
template <typename Tuple> void callWithTuple(Tuple &&t) {
  // make_index_sequence<3>{} creates index_sequence<0, 1, 2>.
  // decay_t strips the reference.
  callImpl(
      t,
      std::make_index_sequence<std::tuple_size<std::decay_t<Tuple>>::value>{});
}

int main() {
  auto seg = std::make_tuple("__TEXT", 0x10000000, 0x4000);
  // Unpacks to: printSegment("__TEXT", 0x10000000, 0x4000);
  callWithTuple(seg);
  return 0;
}

View on GitHub.

Output

$ ./src/c++14/build/compile-time-integer-sequences
__TEXT @ 0x10000000 (size: 0x4000)