Chcę wiedzieć, jakie są semantyczne różnice między propozycją pełnych koncepcji C ++ a ograniczeniami szablonowymi (na przykład ograniczenia, które pojawiły się w Dlang lub nowa propozycja konceptów lite dla C ++ 1y ).
Co potrafią pełnoprawne koncepcje, czego nie potrafią ograniczenia szablonowe?
c++
c++11
d
c++-concepts
Rayniery
źródło
źródło
Odpowiedzi:
Sekcja 3 propozycji ograniczeń obejmuje to w rozsądny sposób.
Propozycja koncepcji została odłożona na chwilę na dalszy plan w nadziei, że ograniczenia (tj. Concept-lite) można rozwinąć i zaimplementować w krótszej skali czasowej, obecnie dążąc przynajmniej do czegoś w C ++ 14. Propozycja ograniczeń ma działać jako płynne przejście do późniejszej definicji pojęć. Ograniczenia są częścią propozycji koncepcji i są niezbędnym elementem składowym jej definicji.
Podczas projektowania bibliotek koncepcyjnych dla C ++ , Sutton i Stroustrup rozważają następującą zależność:
Aby szybko podsumować ich znaczenie:
Więc jeśli dodasz aksjomaty (właściwości semantyczne) do ograniczeń (właściwości składniowe), otrzymasz pojęcia.
Concepts-Lite
Propozycja Concept-Lite niesie nam tylko pierwszą część, ograniczenia, ale jest to ważny i konieczny krok w kierunku pełnoprawnych koncepcji.
Ograniczenia
W ograniczeniach chodzi o składnię . Dają nam sposób statycznego rozróżniania właściwości typu w czasie kompilacji, dzięki czemu możemy ograniczyć typy używane jako argumenty szablonu na podstawie ich właściwości składniowych. W obecnej propozycji ograniczeń są one wyrażane za pomocą podzbioru rachunku zdań przy użyciu łączników logicznych, takich jak
&&
i||
.Przyjrzyjmy się ograniczeniu w akcji:
Tutaj definiujemy szablon funkcji o nazwie
sort
. Nowym dodatkiem jest klauzula wymagań . Klauzula require daje pewne ograniczenia dotyczące argumentów szablonu dla tej funkcji. W szczególności to ograniczenie mówi, że typCont
musi byćSortable
typem. Fajną rzeczą jest to, że można to zapisać w bardziej zwięzłej formie jako:Teraz, jeśli spróbujesz przekazać cokolwiek, co nie jest brane pod uwagę
Sortable
w tej funkcji, otrzymasz niezły błąd, który natychmiast poinformuje Cię, że typ wydedukowanyT
nie jestSortable
typem. Jeśli zrobił to w C ++ 11, można by mieć jakiś straszny błąd wyrzucony z wewnątrz tejsort
funkcji, że nie ma sensu nikogo.Predykaty ograniczeń są bardzo podobne do cech typu. Biorą jakiś szablon typu argumentu i podają kilka informacji na jego temat. Ograniczenia próbują odpowiedzieć na następujące rodzaje pytań dotyczących typu:
Jednak ograniczenia nie mają na celu zastąpienia cech typu. Zamiast tego będą pracować ramię w ramię. Niektóre cechy typu można teraz definiować w kategoriach pojęć, a inne w kategoriach cech typu.
Przykłady
Tak więc ważną rzeczą dotyczącą ograniczeń jest to, że nie dbają o semantykę ani na jotę. Oto kilka dobrych przykładów ograniczeń:
Equality_comparable<T>
: Sprawdza, czy typ ma==
oba operandy tego samego typu.Equality_comparable<T,U>
: Sprawdza, czy istnieje==
lewy i prawy operand podanych typówArithmetic<T>
: Sprawdza, czy typ jest typem arytmetycznym.Floating_point<T>
: Sprawdza, czy typ jest typem zmiennoprzecinkowym.Input_iterator<T>
: Sprawdza, czy typ obsługuje operacje składniowe, które musi obsługiwać iterator wejściowy.Same<T,U>
: Sprawdza, czy dany typ jest taki sam.Możesz wypróbować to wszystko dzięki specjalnej, koncepcyjnej wersji GCC .
Beyond Concepts-Lite
Teraz zajmiemy się wszystkim poza koncepcją lite propozycji. To jest nawet bardziej futurystyczne niż sama przyszłość. Od tego momentu wszystko prawdopodobnie trochę się zmieni.
Aksjomaty
Aksjomaty dotyczą semantyki . Określają relacje, niezmienniki, gwarancje złożoności i inne tego typu rzeczy. Spójrzmy na przykład.
Chociaż
Equality_comparable<T,U>
ograniczenie powie ci, że istnieje obiekt,operator==
który przyjmuje typy,T
aU
nie mówi ci, co oznacza ta operacja . W tym celu będziemy mieli aksjomatEquivalence_relation
. Ten aksjomat mówi, że gdy porównuje się przedmioty tych dwóch typów zoperator==
dawaniemtrue
, to przedmioty te są równoważne. Może się to wydawać zbędne, ale z pewnością tak nie jest. Możesz łatwo zdefiniować,operator==
że zamiast tego zachowuje się jakoperator<
. Byłbyś zły, gdybyś to zrobił, ale mógłbyś.Innym przykładem jest
Greater
aksjomat. Dobrze i dobrze jest powiedzieć, że dwa obiekty typuT
można porównać z operatorami>
i<
, ale co one oznaczają ?Greater
Aksjomat mówi, że wtedy i tylko wtedyx
jest większa wtedyy
, wtedyy
jest mniej niżx
. Proponowana specyfikacja taka aksjomat wygląda następująco:Tak więc aksjomaty odpowiadają na następujące rodzaje pytań:
Oznacza to, że zajmują się wyłącznie semantyką typów i operacjami na tych typach. Tych rzeczy nie można sprawdzić statycznie. Jeśli trzeba to sprawdzić, typ musi w jakiś sposób oświadczyć, że jest zgodny z tą semantyką.
Przykłady
Oto kilka typowych przykładów aksjomatów:
Equivalence_relation
: Jeśli porównują się dwa obiekty==
, są one równoważne.Greater
: Kiedykolwiekx > y
, następniey < x
.Less_equal
: Kiedykolwiekx <= y
, następnie!(y < x)
.Copy_equality
: Dlax
iy
typuT
: jeślix == y
, nowy obiekt tego samego typu utworzony przez konstrukcję kopiującąT{x} == y
i nadalx == y
(to znaczy jest nieniszczący).Koncepcje
Teraz pojęcia są bardzo łatwe do zdefiniowania; są po prostu połączeniem ograniczeń i aksjomatów . Zapewniają abstrakcyjne wymaganie dotyczące składni i semantyki typu.
Jako przykład rozważ następującą
Ordered
koncepcję:Najpierw należy zauważyć, że aby typ szablonu
T
byłOrdered
, musi również spełniać wymaganiaRegular
koncepcji.Regular
Koncepcja jest bardzo podstawowe wymagania, że typ jest dobrze ułożona - może być wykonana, zniszczony, kopiowany i porównywane.W uzupełnieniu do tych wymagań,
Ordered
wymaga, abyT
spełnić jedno ograniczenie i cztery aksjomaty:Ordered
typ musi mieć rozszerzenieoperator<
. Jest to sprawdzane statycznie, więc musi istnieć.x
iy
typuT
:x < y
daje ścisłe uporządkowanie całkowite.x
jest większe niży
,y
jest mniejsze niżx
i odwrotnie.x
jest mniejsze lub równey
,y
jest nie mniejsze niżx
i odwrotnie.x
jest większe lub równey
,y
nie jest większe niżx
i na odwrót.Połączenie takich ograniczeń i aksjomatów daje ci koncepcje. Definiują wymagania składniowe i semantyczne dla typów abstrakcyjnych używanych z algorytmami. Obecnie algorytmy muszą zakładać, że użyte typy będą obsługiwać określone operacje i wyrażać określoną semantykę. Dzięki koncepcjom będziemy w stanie zapewnić spełnienie wymagań.
W najnowszym projekcie koncepcyjnym kompilator sprawdza tylko, czy wymagania składniowe pojęcia są spełnione przez argument szablonu. Aksjomaty pozostają niezaznaczone. Ponieważ aksjomaty oznaczają semantykę, która nie jest statycznie oceniana (lub często niemożliwa do całkowitego sprawdzenia), autor typu musiałby wyraźnie stwierdzić, że ich typ spełnia wszystkie wymagania pojęcia. Było to znane jako mapowanie koncepcyjne w poprzednich projektach, ale od tego czasu zostało usunięte.
Przykłady
Oto kilka przykładów pojęć:
Regular
typy można skonstruować, zniszczyć, skopiować i można je porównać.Ordered
typy obsługująoperator<
i mają ścisłe porządkowanie całkowite i inną semantykę porządkowania.Copyable
typy można kopiować, można je zniszczyć, a jeślix
jest równey
ix
jest kopiowane, kopia będzie również porównywana zy
.Iterator
Typy musiało związane typyvalue_type
,reference
,difference_type
, iiterator_category
które same muszą spełniać pewne koncepcje. Muszą również wspieraćoperator++
i być dereferencyjnymi.Droga do koncepcji
Ograniczenia są pierwszym krokiem w kierunku pełnej funkcji koncepcyjnej języka C ++. Są bardzo ważnym krokiem, ponieważ zapewniają statycznie egzekwowalne wymagania typów, dzięki czemu możemy pisać znacznie czystsze funkcje i klasy szablonów. Teraz możemy uniknąć niektórych trudności i brzydoty towarzyszących
std::enable_if
jej metaprogramowaniu.Jest jednak kilka rzeczy, których propozycja ograniczeń nie obejmuje:
Nie zawiera języka definicji pojęcia.
Ograniczenia nie są mapami pojęć. Użytkownik nie musi specjalnie opisywać swoich typów jako spełniających określone ograniczenia. Są one statycznie sprawdzane przy użyciu prostych funkcji języka kompilacji.
Implementacje szablonów nie są ograniczone przez ograniczenia dotyczące ich argumentów szablonów. Oznacza to, że jeśli szablon funkcji robi coś z obiektem typu ograniczonego, czego nie powinien, kompilator nie ma możliwości zdiagnozowania tego. W pełni funkcjonalna propozycja koncepcji byłaby w stanie to zrobić.
Propozycja ograniczeń została specjalnie zaprojektowana, tak aby można było wprowadzić pełną propozycję koncepcji. Przy odrobinie szczęścia ta zmiana powinna przebiegać dość płynnie. Grupa koncepcyjna chce wprowadzić ograniczenia dla C ++ 14 (lub wkrótce potem w raporcie technicznym), podczas gdy pełne koncepcje mogą zacząć pojawiać się gdzieś w okolicach C ++ 17.
źródło
Zobacz także „co jest 'lite' o konceptach lite” w sekcji 2.3 ostatnich (12 marca) protokołów z telekonferencji Concepts i zapisów dyskusji, które zostały opublikowane tego samego dnia tutaj: http://isocpp.org/blog/2013/03 / nowy-papier-n3576-sg8-koncepcje-z-telekonferencji-2013-03-12-zioła-szmata .
źródło
Moje 2 centy:
Propozycja Concept-Lite nie służy do „sprawdzania typu” implementacji szablonu . Oznacza to, że Concepts-lite zapewni (teoretycznie) zgodność interfejsu w miejscu tworzenia szablonu. Cytując z artykułu: „Concepts lite jest rozszerzeniem C ++, które pozwala na użycie predykatów w celu ograniczenia argumentów szablonów”. I to wszystko. Nie mówi, że treść szablonu zostanie sprawdzona (w izolacji) względem predykatów. To prawdopodobnie oznacza, że nie ma pierwszorzędnego pojęcia archtypów, kiedy mówisz o concept-lite. archtypy, o ile dobrze pamiętam, w propozycjach ciężkich od koncepcji to takie, które oferują nie mniej i nic więcej, aby zadowolić realizację szablonu.
Concept-lite używa gloryfikowanych funkcji constexpr z odrobiną sztuczki składniowej obsługiwanej przez kompilator. Brak zmian w regułach wyszukiwania.
Od programistów nie wymaga się pisania map pojęć.
Na koniec jeszcze raz cytując: „Propozycja ograniczeń nie odnosi się bezpośrednio do specyfikacji lub użycia semantyki; ma na celu jedynie sprawdzenie składni”. Oznaczałoby to, że aksjomaty nie wchodzą w zakres (na razie).
źródło