Ограничения C++ включают, если vs требует


Я только что пробежался по ключевому слову C++ requires и хочу знать, правильно ли мое понимание: оба requires и enable_if предлагают ограничения времени компиляции для шаблонов. Если требуют ограничения будут включены вообще.

Где требует предлагает способ ограничения параметров функции, enable_if имеет основной целью ограничение трансляции времени компиляции определенными условиями типа шаблона сам.

Примеры:

#include <type_traits>

template<typename T>
concept T AdditiveGroup
{
  return requires(const T pA, const T pB)
  {
    { pA + pB }->T;
  };
};

template<typename T>
typename std::enable_if<std::is_integral<T>::value, bool>::type
addElements(const T pA, const T pB)
{ 
  return (pA + pB);
}

Здесь концепция должна работать тогда и только тогда, когда pA и pB могут быть добавлены, тогда как условие enable_if ограничивает оценку интегральными типами.

Спасибо, что дали мне знать, правильно ли я все понял!

П. С.: Я пока не совсем уверен, о синтаксисе требуется ограничения, которые, кажется, меняются. Кроме того, не знаю, какой компилятор принимает их в настоящее время, так что спасибо за любые подсказки!

1 2

1 ответ:

Да, ваше понимание кажется правильным. Использование SFINAE для ограничения шаблонов (например, enable_if) имеет тот же существенный эффект, что и шаблоны, ограниченные концепцией. Однако (как вы упомянули), SFINAE имеет дополнительные побочные эффекты.

Джексонвилльская статья вилле о его обосновании включения концептов в C++17 отлично объясняет ловушки ограничений, основанных на SFINAE, по сравнению с концепциями. По существу:

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