Изменения

Перейти к: навигация, поиск

Участник:Qwerty787788/плюсы3сем

3244 байта добавлено, 03:47, 20 января 2013
concepts
=== concepts ===
Это описание свойств типа, необходимых для работы в шаблоне. Компилятор на основе этих данных может производить дополнительные оптимизации, а программист может указывать, что ему нужно от типа, который дают шаблону. В сущности, это нововведение лишь даёт мизерный прирост к скорости и делает более понятными некоторые сообщения компилятора об ошибках.
 
<source lang=Cpp>
auto concept LessThanComparable<typename T> {
requires SomeConcept<T>;
bool operator<(T, T);
}
</source>
 
* Ключевое слово auto указывает, что проверять на совместимость с концептом надо любые типы. Всё, что подошло по условию, концептом поддерживается.
* concept - ключевое слово "это концепт". С уважением, капитан Очевидность.
* LessThanComparable - собственно, название концепта, а в угловых скобках - аналогично объявлению шаблона, удовлетворяющие ему типы. Далее в фигурных скобках идёт описание концепта.
* requires - ключевое слово, которое можно применить и при объявлении шаблона - требует выполнения типом T этого концепта другого концепта SomeConcept. Именно типом T, поскольку их может быть несколько.
* Объявление функции - обязывает претендента на совместимость с концептом такую функцию иметь в ближайшем доступе - будь то где-то снаружи или внутри класса.
 
Применить его можно так:
<source lang=Cpp>
template<LessThanComparable T>
const T& min(const T &x, const T &y) {
return (y < x) ? y : x;
}
</source>
Или так:
<source lang=Cpp>
template<typename T> requires LessThanComparable<T>
const T& min(const T &x, const T &y) {
return (y < x) ? y : x;
}
</source>
Последний способ лучше тем, что позволяет указать для типа несколько требований одновременно без необходимости создавать новый концепт, содержащий их все. К слову, концепты можно и наследовать, хотя это и аналогично применению requires.
 
Концепты были убраны из чернового стандарта C++11 в июле 2009 года. Однако опенсорс подхватил идею и реализовал её в ConceptGCC, форке GNU C++ compiler.
 
Остальное можете почитать здесь: http://en.wikipedia.org/wiki/Concepts_(C%2B%2B)
== ranges ==
12
правок

Навигация