Существует ли проверка интерфейса шаблона C++?

238
30 октября 2017, 23:35

В книге Бьярне Страуструпа "Программирование. Принципы и практика с использованием C++, 2-е издание.", глава 19, пункт 19.3.3 написано, что в С++14 мы можем использовать и применять к аргументам шаблона некую концепцию или требования шаблона.

template<typename T>  // Для всех типов T
    requires Element<T>() // таких, что является Element 
 class vector {
 // . . .
 };

Вот пара концепций, которые предоставлены в книге (там их много):

Element<E> (): Е может быть элементом контейнера
Number<N> () : N ведет себя как число, поддерживая операции +, -, * и /.

Но этот код не компилируется. Пожалуйста, объясните есть ли ключевое слово requires и вообще концепции шаблонов в С++?

Answer 1

Концепций нет в С++14, и их не будет в С++17.

В настоящее время концепции реализованы только в GCC 6.1+, и включаются ключом командной строки -fconcepts:

> type main.cpp
#include <iostream>
template<typename T>
requires sizeof(T) < 4
void f() {
    std::cout << "< 4\n";
}
template<typename T>
requires sizeof(T) >= 4
void f() {
    std::cout << ">= 4\n";
}    
int main() {
    f<short>();
    f<double>();
}
> g++ -fconcepts -std=c++14 -Wall -pedantic main.cpp && a
< 4
>= 4

Краткое описание синтаксиса можно прочитать на cppreference.

READ ALSO
Классификация итераторов

Классификация итераторов

Как в коде применяются классы классификации итераторов:

242
Как обнулить значение в массиве с++ [требует правки]

Как обнулить значение в массиве с++ [требует правки]

Как обнулить значение элемента массива A, если в массиве B существует такое значение, которое при сложении с текущим элементом массива A дает...

436
Как добавить столбец в матрицу? с++

Как добавить столбец в матрицу? с++

надо добавить столбец в matrix из вектора matrix1

785
Библиотеки для поиска и анализа кривых на изображении

Библиотеки для поиска и анализа кривых на изображении

ПриветствуюДопустим, имеется изображение: На данном изображении три кривых (графика), части которых могут быть разной толщины или пунктирные/штриховые

320