Сопоставление с образцом в C ++ - альтернатива использованию операторов if для управления логическим потоком. Сопоставление с образцом позволяет организовать код в виде сопоставления с образцами и операторов, которые будут выполняться при обнаружении сопоставления с образцом.

Вы можете рассматривать сопоставление с образцом как обобщение оператора switch-case в C и C ++.

В следующем примере вычисления факториала используется сопоставление с образцом для реализации факториала числа. Это достигается путем сопоставления двух шаблонов в указанном порядке:

  • Шаблон 0 → 1
  • Шаблон n → n * факториал (n-1)
int factorial(int n) {
  using namespace mpark;
  return match(n)(
       pattern(0) =   []         {return 1;},
       pattern(arg) = [](auto n) {return n*factorial(n-1);}
);
}

Вы можете использовать более сложные сопоставления с образцом. В приведенном ниже примере показано сопоставление с образцом на основе двух чисел. Указанный здесь шаблон соответствует двум числам. Условия шаблона для сопоставления указаны как:

  • Шаблон (i делится на 3, i делится на 5) → «fizzbzz»
  • Шаблон (i делится на 3, i не делится на 5) → «fizz»
  • Шаблон (i не делится на 3, i делится на 5) → «жужжание»
  • Шаблон (i не делится на 3 или 5) → i

Код сопоставления с образцом для этого примера:

void fizzbuzz() {
  for (int i = 1; i <= 100; ++i) {
    using namespace mpark;
    match(i % 3, i % 5)(
        pattern(0, 0) = []  { std::cout << "fizzbuzz\n"; },
        pattern(0, _) = []  { std::cout << "fizz\n"; },
        pattern(_, 0) = []  { std::cout << "buzz\n"; },
        pattern(_, _) = [i] { std::cout << i << std::endl; }
      );
  }
}

Мы коснулись поверхности того, что вы можете сделать с библиотекой сопоставления шаблонов на GitHub Майкла Парка. Следующее видео на @cppnow дополнительно иллюстрирует использование библиотеки шаблонов.