Size: a a a

2020 October 24

АР

Андрей Руссков... in pro.cxx
да, наверно прокатит
источник

АР

Андрей Руссков... in pro.cxx
слушайте, а есть идея. Допустим есть у нас

class T {};
concept 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
источник

AT

Anatoly Tomilov in pro.cxx
Только нужен трейт template<typename T, typename ...Types> constexpr bool any_of = (std::is_same_v<T, Types> || ...);.
источник

АР

Андрей Руссков... in pro.cxx
это другое
источник

АР

Андрей Руссков... in pro.cxx
C не должен знать про T/U
источник

АР

Андрей Руссков... in pro.cxx
поправил пример
источник

VS

Vlad Serebrennikov in pro.cxx
Андрей Руссков
слушайте, а есть идея. Допустим есть у нас

class T {};
concept 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 страуструп подробно про них рассказывает
источник

D

Danya in pro.cxx
Андрей Руссков
слушайте, а есть идея. Допустим есть у нас

class T {};
concept 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
Это похоже на протоколы свифта
источник

D

Danya in pro.cxx
Но какие у этого преимущества?
источник

CD

Constantine Drozdov in pro.cxx
Андрей Руссков
слушайте, а есть идея. Допустим есть у нас

class T {};
concept 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
class T { using C_exact = std::true_type; }
источник

CD

Constantine Drozdov in pro.cxx
Андрей Руссков
слушайте, а есть идея. Допустим есть у нас

class T {};
concept 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
Тут смотри какое дело. При кажущейся похожести подобной структуры это немного не концепты, а трейты (что характерно, можно добиться эффекта через специализацию шаблона). Я не помню терминов, но есть разница между подходом "сущность определяется содержимым" (как struct в C) и "сущность определяется именем" (как struct в С++). Концепты это первое, и это само по себе кажется очень важным - концепт это не более, чем соглашение вот этот набор свойств называть вот так, в которое при помощи tag-ов дописаны свойства, которые в текущий момент не могут быть записаны в языке как утверждения, после чего концепт не может страдать архитектурными ошибками вида "в этом трейте требуется лишнее" - концепт это только имя.
источник

CD

Constantine Drozdov in pro.cxx
Не знаю, насколько понятна идея, которую я пытаюсь донести, но когда некоторая библиотека обнаруживает, что некоторое подмножество функций реализовано исходя из избыточных требований, с трейтами ситуация выглядит намного более скверно, чем с концептами - концепт не является обязывающей формой контракта и при обновлении библиотеки для доступа к новым функциям не надо будет исправлять весь user-код. При этом стоит отметить, что ошибиться и указать недостаточные требования к аргументам намного сложнее, чем ошибиться и указать избыточные
источник

AF

Aidar Fattakhov in pro.cxx
Так у вас же никто не забирает наследование и теги, тегайте тегами, трейтьте трейтами
источник

CD

Constantine Drozdov in pro.cxx
Aidar Fattakhov
Так у вас же никто не забирает наследование и теги, тегайте тегами, трейтьте трейтами
Наследование забирают, вместо него отношение частичного порядка на множестве концептов, то самое по принципу Лисков "A является B"
источник

AF

Aidar Fattakhov in pro.cxx
Constantine Drozdov
Наследование забирают, вместо него отношение частичного порядка на множестве концептов, то самое по принципу Лисков "A является B"
Наследование можно использовать как тег
источник

AF

Aidar Fattakhov in pro.cxx
Constantine Drozdov
Наследование забирают, вместо него отношение частичного порядка на множестве концептов, то самое по принципу Лисков "A является B"
Ой да всем плевать на лисков, кажется это в какой-то красной книжке написано
источник

CD

Constantine Drozdov in pro.cxx
Aidar Fattakhov
Наследование можно использовать как тег
Но не нужно, тегами нужно закрывать свойства, которые являются неописываемыми в языке математическими утверждениями (скажем, коммутативность сложения)
источник

AF

Aidar Fattakhov in pro.cxx
Constantine Drozdov
Но не нужно, тегами нужно закрывать свойства, которые являются неописываемыми в языке математическими утверждениями (скажем, коммутативность сложения)
Ты хочешь ещё один квалификатор для комутативности?
источник

AF

Aidar Fattakhov in pro.cxx
Спецификатор*
источник

AF

Aidar Fattakhov in pro.cxx
Я не смогу и так все существующие перечислить
источник