Użycie konceptów w C++

0

Cześć, zapoznaję się z biblioteką konceptów w C++ i widzę pewne różnice w informacjach na ten temat, a mianowicie - dwa sposoby tworzenia konceptów.
Pierwszy z nich zakłada, że koncept tworzony jest według schematu

template <typename T>
concept nazwa_konceptu = ....

Tutaj po znaku równości zazwyczaj występuje zdefiniowana funkcja requires()

Drugi ze sposobów wygląda nieco inaczej:

auto concept nazwa_konceptu<typename T>{ ... }

Przy czym słowo kluczowe auto nie musi występować. Potem oczywiście inaczej wygląda też zastosowanie danego konceptu w funkcji / klasie.
Moje pytanie jest jednak takie - czy te dwie metody są równoważne, czy może występują między nimi jakieś różnice? Można stosować je wymiennie?

To, co rzuca się w oczy na początku to to, że w pierwszym przypadku używamy template<typename T>, w drugim nie oraz że w pierwszym używamy znaku równości i potem zazwyczaj funkcji requires(), natomaist w drugim nie ma znaku równości, wszystko jest zapisane w klamerkach { }.

Czy ktoś byłby w stanie przybliżyć mi ten temat?

4

template <typename T>
concept nazwa_konceptu = ....

Tutaj po znaku równości zazwyczaj występuje zdefiniowana funkcja requires()

Sporo błędów w jednym zdaniu. Zazwyczaj po znaku równości pojawia się type trait a nie requires. Poza tym, requires to nie funkcja tylko słowo kluczowe, a nawiasy oznaczają, że masz do czynienia z requires-expression. Nie potrzebujesz używać requires gdy używasz konceptów, choć akurat jest to dość wygodne, oraz nie potrzebujesz konceptów, żeby używać requires.

Typowe zastowanie requires z prostymi konceptami jest dość zgrabnie opisane przez Andrzeja https://akrzemi1.wordpress.com/2020/03/26/requires-clause/
Pisał również o requires-expression https://akrzemi1.wordpress.com/2020/01/29/requires-expression/

0

Cześć. Dziękuję za odpowiedź :) ale chyba się nie rozumiemy. Nie chodzi mi o requires
nie jako o tak używane słowo kluczowe, tylko, tak jak jest to opisane np. tutaj https://programowaniezpasja.pl/blog/cpp/koncepty-w-cpp20/?cookie-state-change=1620799715446 w przykładzie, czy w drugim podesłanym przez Ciebie linku.

Na podanej stronie jest opisany właśnie ten pierwszy przykład tworzenia konceptów, z którym spotkałem się też na kilku innych stronach, natomiast często w książkach lub na innych stronach spotykam drugi opisany sposób.

Zostawiając jednak już kwestie samego requires, przedstawione dwa sposoby tworzenia konceptów różnią się, jeden zawiera znak równości, drugi nie, jeden używa na początku template, drugi nie.
Tutaj ponawiam pytanie - jaka jest różnica między tymi sposobami?

4

Wg dokumentacji jest jeden sposób definiowania konceptu

template < template-parameter-list >
concept concept-name = constraint-expression;

Mógłbyś podesłać źródło w którym widziałeś użycie concept z klamrami?

EDIT
Byłem na tyle zaintrygowany, że postanowiłem to znaleźć. Jedyny ślad takiej składni jaki znalazłem jest na reddicie https://www.reddit.com/r/cpp/comments/4bz4qf/c_concepts_definition_expression_constraints/ Post sprzed pięciu lat, który odwołuje się do wikipedii, która już tej składni nie zawiera. Wygląda na to, że tak wyglądała jedna z propozycji składni konceptów, jednak nie jest ona prawidłowa prawidłowa wg. aktualnych źródeł, najnowszy gcc również nie chce takiej składni zaakcpeptować https://wandbox.org/permlink/GSahMXk56bsbxuOU

0

Faktycznie, poprzednie źródła są starsze i już nieaktualne. Dziękuję bardzo za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1