Строгий слабый порядок значений указателя

Возможно, вы захотите использовать verify () в сочетании с ArgumentCaptor, чтобы обеспечить выполнение в тесте и ArgumentCaptor для оценки аргументов:

ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
verify(mock).myFunction(argument.capture());
assertEquals("the expected value here", argument.getValue());

Значение аргумента очевидно доступно через аргумент. getValue () для дальнейшей манипуляции / проверки /whatever.

1
задан fliX 15 January 2019 в 15:35
поделиться

1 ответ

Использование std::less<Bar*> достаточно (но использование operator< не достаточно). Специализации указателей из std::less (как указывает принятый ответ на «Использование std :: less with nullptr» ) гарантируют полное упорядочение . Сравнение с nullptr является неопределенным , что означает, что стандарт не налагает конкретное упорядочение, но std::less должен все же произвести полное упорядочение (и для данный указатель p, p < nullptr обязательно выдает одно и то же значение каждый раз).

Так как полное упорядочение сильнее, чем слабое, в вашем случае достаточно использовать std::less.

РЕДАКТИРОВАТЬ: Если нет, то как правильно (например, как объединить std :: less с std :: tie)?

К сожалению, не существует изящного способа. Поскольку std::tie возвращает std::tuple, и сравнение кортежей определяется в терминах operator< по их значениям (а не std::less), вы не можете использовать здесь std::tie. Чтобы использовать std::less, вам нужно будет сделать это вручную:

bool operator<(const Foo& rhs) const {
  if (std::less<>{}(x, rhs.x))
    return true;
  if (std::less<>{}(rhs.x, x))
    return false;
  return std::less<>{}(y, rhs.y);
}

Кроме того, ваша текущая реализация (переосмысление указателей как целых чисел) также производит полное упорядочение (очевидно, поскольку вы сравниваете целые числа), но вместо неопределенного поведения у вас будет определяемое реализацией поведение (из reinterpret_cast).

0
ответ дан You 15 January 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: