Сопоставление с образцом в 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 дополнительно иллюстрирует использование библиотеки шаблонов.