2016-05-19 2 views
2

Я просто побежал вдоль C++ требует ключевого слова и вы хотите знать, правильно ли я понимаю, до сих пор: Оба требует и enable_if предложение компиляции временных ограничений для шаблонов. Если требует ограничения будут включены вообще.C++ ограничения 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); 
} 

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

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

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

+0

Синтаксис 'require' происходит от Concepts Lite, который еще не завершен. – kennytm

+0

Я решил, что он все еще находится в разработке. Предполагая, что это будет рассмотрено для будущего стандарта, я хотел знать, правильно ли я понял эти идеи. Тем временем я нашел эту полезную статью, которая показывает, что оба подхода в основном основаны на шаблонах: http://accu.org/index.php/journals/2198 – gilgamash

+0

Для примеров/деталей вы можете взглянуть на [N4377 - Языки программирования - Расширения C++ для концепций] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4377.pdf). К сожалению [понятия не делали C++ 17] (http://honermann.net/blog/2016/03/06/why-concepts-didnt-make-cxx17/), но GCC v6 поддерживает их (через '-fconcepts 'переключатель). – manlio

ответ

4

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

Ville's Jacksonville paper О его обосновании для включения концепций в C++ 17 отличная работа по объяснению ловушек ограничений на основе SFINAE по сравнению с концепциями. По существу:

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

Спасибо LOT за ссылку, обозначают проблемы, которые мне не нравились, но не осмеливались говорить! Надеюсь, скоро у нас появятся концепции. Ответьте upvoted! – gilgamash