cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Концепты в объявлении класса #471

Closed kol65536black closed 2 years ago

kol65536black commented 2 years ago

Есть предложение добавить возможность прописывать концепты в месте где прописываем наследование.

class SomeClass : public SomeParent1, SomeConcept1, SomeConcept2

При этом подразумевается, что компилятор должен проверить класс требованиям концепта. Если не соответствует концепту, то код не компилируется.

Так же думаю, был бы полезен способ описывать концепт в стиле трейтов или тайпклассов. Т.е. указать, что должны быть функции или поля с определенными именами. Пример:

template<typename T>
concept class SomeConcept1
{
public:
     void add(T& item);           //требование, что класс должен иметь метод с названием add с соответствующей  сигнатурой
     void remove(T& item);     //требование, что класс должен иметь метод с названием remove с соответствующей  сигнатурой
};
apolukhin commented 2 years ago

Приблизительно с этого начинали прорабатывать текущие концепты C++20. Только вот при описании в виде класса сложно выразить такие вещи как "функция возвращает тип, преобразоввываемый к bool" или "свободная функция принимает тип X". Поэтому пришли к текущему виду концептов.

Для проверки соответствия класса концепту можно использовать static_assert и/или requires. При этом нет необходимости загромождать декларацию класса, делать проверку в хедере (точнее - в каждой единице трансляции, куда этот хедер подключатеся).

kol65536black commented 2 years ago

Если я правильно понял сказанное в первом абзаце, то предложенная идея (или похожая на предложенную) уже прорабатывалась и пришли к выводу, что она не годится в качестве универсального инструмента на все случаи жизни. Есть случаи, когда идея "не работает".

Отсюда делается вывод, что она так же не годится в роли более специализированного инструмента, дополняющего уже введенные в стандарт концепты.

Ох, ну ок. :(