C; // C<T> -> true
auto foo(C auto x) { ... }
Скажем любой U, повторяющий интерфейс T, будет удовлетворять C. Допустим мы хотим именно eager (блин как это слово на русский переводится?) трейты - чтобы U удовлетворял C только если явно это укажет
А если как-нить так:
explicit concept C; // "explicit" keyword here
class T : C { ... };
class U { ... };
auto foo(explicit C auto x) { ... } // or maybe here
foo(T{}); // ok
foo(U{}); // failure
мне это чем-то напоминает концепты, которые разрабатывались для 11 стандарта. в последнем или предпоследнем hopl страуструп подробно про них рассказывает
Это похоже на протоколы свифта
class T { using C_exact = std::true_type; }
Тут смотри какое дело. При кажущейся похожести подобной структуры это немного не концепты, а трейты (что характерно, можно добиться эффекта через специализацию шаблона). Я не помню терминов, но есть разница между подходом "сущность определяется содержимым" (как struct в C) и "сущность определяется именем" (как struct в С++). Концепты это первое, и это само по себе кажется очень важным - концепт это не более, чем соглашение вот этот набор свойств называть вот так, в которое при помощи tag-ов дописаны свойства, которые в текущий момент не могут быть записаны в языке как утверждения, после чего концепт не может страдать архитектурными ошибками вида "в этом трейте требуется лишнее" - концепт это только имя.
да, знаю. Но иногда хочется именно трейт.
Обсуждают сегодня