Как я могу проверить, достаточна ли моя концепция для реализации моей функции?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Как я могу проверить, достаточна ли моя концепция для реализации моей функции?

Сообщение Гость »


Когда я пишу шаблонную функцию, я хотел бы использовать концепции, а также быть уверенным, что я не использовал в своей функции что-то сверх «контракта», указанного в концепции. См. основные рекомендации C++ T.10.

Мотивирующий, но искусственный пример:

шаблон концепция maxable = std::totally_ordered; // или требуем x < y -> bool шаблон Т макс(Т х0, Т х1, Т х2) { Т х = х0; если (х < х1) х = х1; если (х < х2) х = х2; вернуть х; } max(0, 1, 2) /*->2*/ это нормально, но, к сожалению, следующее не компилируется:

struct Val { интервал х {}; Val(int x) : x(x) {} Val(const Val&) = удалить; автоматический оператор(const Val&) const = по умолчанию; }; auto v = max(Значение{0}, Значение{1}, Значение{2}); с ошибкой 'Val::Val(const Val &)': попытка сослаться на удаленную функцию в реализации моей функции в строке T x = x0;.

Я могу исправить ошибку в своей концепции, добавив std::copy_constructible, при котором возникает ошибка компиляции (в MSVC)

ошибка C2672: 'max': не найдена соответствующая перегруженная функция может быть «T max(T,T,T)» примечание: связанные ограничения не удовлетворены примечание: концепция «maxable» оценена как ложная примечание: концепция 'std::copy_constructible' оценена как false Это то, чего я хочу — пользователь получит предупреждение о неудовлетворении ограничения, вместо того, чтобы просматривать мою реализацию. Но есть ли какой-нибудь удобный способ проверить, что я ничего не забыл в своей концепции или, наоборот, не использовал то, чего не следовало бы? Я предполагаю, что эксперты, которые пишут алгоритмы библиотеки std, должны иметь какой-то способ сделать это правильно - или я думаю об этом неправильно?
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»