Ограничения 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 ответ:
Да, ваше понимание кажется правильным. Использование SFINAE для ограничения шаблонов (например,
enable_if
) имеет тот же существенный эффект, что и шаблоны, ограниченные концепцией. Однако (как вы упомянули), SFINAE имеет дополнительные побочные эффекты.Джексонвилльская статья вилле о его обосновании включения концептов в C++17 отлично объясняет ловушки ограничений, основанных на SFINAE, по сравнению с концепциями. По существу:
- понятия позволяют ограничивать аргументы функции, не отключая дедукцию и не нарушая метааритетность ограниченного шаблона функции.
Концепции значительно облегчают написание перегрузок с взаимоисключающими ограничениями. Концепции позволяют создавать широкий спектр конструкций ограничений, предоставляя разработчику интерфейса различные инструменты для определения того, какие абстракции нужны конкретному интерфейсу.