Привет!

Я кратко опишу, как мне кажется, полезный способ создания хороших методов ожидания gtest. Я буду использовать шаблоны, параметры шаблонов по умолчанию и decltype.

Проблема:

Мы хотим обобщить две функции. Проблема возникает, если мы хотим указать BarType в качестве третьего параметра без FooType в качестве второго, это проблема с параметрами по умолчанию C++. Это можно решить с помощью дополнительной структуры или boost::Optional, но можно ли сделать лучше? Попытайтесь понять это, прежде чем прокрутить вниз. Попробуйте объединить эти два метода ниже в один :)

Решение:

Итак, в основном, давайте построчно: есть создание 3 типов, которые могут быть вычтены компилятором во время вызова метода. Давайте сосредоточимся на FooType:

FooType = decltype(::testing::_) 
or 
FooType = internal::AnythingMatcher - don't use because of internal!

Мы не даем шаблону ничего, кроме типа по умолчанию. Итак, в строке 2 мы можем использовать:

FooType foo = _

Прямо сейчас foo может быть типом любого сопоставителя или любого типа, который мы указываем в параметре вызова метода.

Вызовы методов:

Прямо сейчас мы можем использовать этот метод несколькими способами:

  • ожиданиеSimpleMethod (1, _, foo)
  • expectSimpleMethod (AnyNumber(), _, foo, [](){некоторая лямбда..})
  • ожидаемый простой метод (любое число (), _, _)
  • ожидаемый простой метод (1)

Как видите, это дает возможность указать AnythingMatcher в качестве параметра. Поэтому в любое время его можно использовать для замены прямых значений.

Как вы думаете? Может ли это быть полезным для вас?
С уважением,

Бартек Блазик.