Jak wielu z was wie, koncepcje , podejście C ++ do ograniczania możliwych typów argumentów szablonu nie zostało uwzględnione w C ++ 11.
Dowiedziałem się, że język programowania D 2.0 ma podobną funkcję do programowania ogólnego. To rozwiązanie wydaje mi się dość eleganckie i proste.
Moje pytanie brzmi więc, dlaczego C ++ nie może zastosować podobnego podejścia .
- Cel koncepcji C ++ może być większy niż to, co zapewnia implementacja D?
- Czy dziedzictwo C ++ uniemożliwia przyjęcie takiego podejścia?
- Czy jakikolwiek inny?
Dziękuję za odpowiedzi.
ps Aby zobaczyć przykłady ogólnej mocy programowania D, zapoznaj się z tym: /programming/7300298/metaprogramming-in-c-and-in-d/7303534#7303534
Odpowiedzi:
Standard C ++ jest dokumentem normatywnym, który określa zasady, które pozostaną (w większości bez zmian) w przyszłych dokumentach. Dlatego komitet przyjął bardzo ostrożne podejście do swoich aktualizacji.
Dodatki do standardowej biblioteki były dość łatwe. Wiele bibliotek działało już od dłuższego czasu: zostało udowodnione, że działają.
Dodatki do podstawowych pojęć w języku są jednak znacznie trudniejsze do eksperymentowania, ponieważ najpierw wymaga modyfikacji kompilatora. Funkcja C ++ 03 (eksport szablonów) została określona bez obsługi kompilatora ... wynik był okropny. Implementatorzy nakładki kompilatora EDG zgłosili to jako ogromne zadanie (kilka osobolat) przy bardzo niewielkim zysku. Żaden inny kompilator nigdy nie próbował go wdrożyć. To nie jest wygodna sytuacja.
Funkcje takie jak
constexpr
lubstatic_assert
były łatwe (i już emulowane przez biblioteki). Jagnięta są dość dobrze rozumiane i wdrażane w wielu innych językach, przeprowadzono już obszerne badania, więc była to głównie kwestia składni.Z drugiej strony Koncepcje uznano za zbyt nowe i niesprawdzone . Zostały ledwie sprecyzowane na czas, nie było dowodu koncepcji ... i dlatego zostały odrzucone, zamiast czekać na nie (lub popełnić błąd).
Dlaczego nie śledzić D? Nie ma powiedzenia, że tak nie będzie. Komitet zachęca ludzi do ponownego przemyślenia od zera, bez konieczności nalegania na ostateczny termin, oraz do spróbowania włączenia ich do kompilatora, aby zobaczyć, jak wchodzą w interakcje z innymi funkcjami w języku. Pojawia się przede wszystkim kwestia oddzielenia Pojęć i Map Pojęć: czy powinny być one połączone w jedną całość, czy nie?
FYI: Obecnie istnieje oddział Clang poświęcony tym eksperymentom, prowadzony przez Larisse Voufo z uniwersytetu w Indianie.
źródło
W przypadku standardu z 2011 r. Opracowywano koncepcje C ++, które ostatecznie zostały usunięte z tego standardu, ponieważ nie były „wystarczająco upieczone”. Kontynuowane są prace nad koncepcjami C ++, które mogą doprowadzić do przejścia do następnego standardu. Może się jednak zdarzyć, że niektórzy ludzie będą pracować nad propozycją następnego standardu, który jest podobny do ograniczeń szablonu D. Czy tak się stanie, czy nie, okaże się. O ile mi wiadomo, nie było takiej propozycji dotyczącej standardu z 2011 r., Więc nie było szansy na przejście do tego standardu bez względu na jego zalety, ale to, co zrobi lub nie zmieni w następny standard, jest całkowicie nieznane w tym momencie.
Nie znam żadnego ważnego powodu, dla którego coś podobnego do ograniczeń szablonu D nie mogło zostać zaimplementowane dla C ++, chociaż biorąc pod uwagę, że C ++ jest ogólnie bardziej ograniczony w tym, co może zrobić w czasie kompilacji, może być trudniej sprawić, aby działały tak samo jak tak jak robią to w D (choć wprowadzenie takich rzeczy na
constexpr
pewno pomaga).Tak naprawdę myślę, że krótką odpowiedzią jest to, że nie ma technicznego powodu, aby coś podobnego do ograniczeń szablonu D nie mogło być w C ++.
Pytanie brzmi, czy taka propozycja zostanie złożona dla następnego standardu i jak będzie się porównywać z podobnymi propozycjami (np. Propozycjami dotyczącymi koncepcji). Zakładając, że można złożyć akceptowalną propozycję, w pełni oczekiwałbym, że coś podobnego do pojęć lub ograniczeń szablonów D przejdzie do następnego standardu po prostu dlatego, że istnieje duże zapotrzebowanie. Pytanie brzmi, czy ktokolwiek może zaproponować propozycję, która jest wystarczająco solidna i „wystarczająco upieczona”, aby mogła zostać zaakceptowana.
źródło
Masz na myśli ograniczenia szablonu D?
O ile wiem, koncepcje C ++ zostały zaproponowane w imieniu boost :: concept. Problem polega na tym, że boost jest biblioteką napisaną dla C ++ 03. C ++ 11 ma inne funkcje składniowe, które pozwolą wdrożyć pewne rzeczy w inny sposób umożliwiający C ++ 03 (a więc zwiększenie sama może być przepisany biorąc zalety nowej składni).
Standardowy komitet porzucił koncepcje, ponieważ ich określenie zajęło zbyt dużo czasu (tym samym ponownie opóźniając zatwierdzenie c ++ 11). Prawdopodobnie będą dostępne w następnej wersji C ++.
Tymczasem składnia D jest inna niż C ++, a sama D zachowuje pewne możliwości oceny wyrażeń w czasie kompilacji C ++ nie zawsze może mieć bez zerwania jakiegoś starszego kodu (coś, czego D nie miałby, mając krótszą historię). C ++ ma teraz sama
static_assert
icostexpr
, które pozwala na poprawę możliwości oceny w czasie kompilacji. Może w przyszłości osiągnie podobny poziom.źródło
Oto QA z Herbem Sutterem, który opowiada o koncepcjach po 15 minutach.
http://channel9.msdn.com/Shows/Going+Deep/Herb-Sutter-C-Questions-and-Answers
Jeśli Ci się spodoba, oto kolejny: http://channel9.msdn.com/Shows/Going+Deep/Conversation-with-Herb-Sutter-Perspectives-on-Modern-C0x11
Co do twojego pytania. Dlaczego nie wersja D? Po co z tego korzystać? C ++ jest bardzo złożonym i stabilnym językiem. Każda funkcja musi być wybierana bardzo ostrożnie, ponieważ zwykle musi być obsługiwana przez dziesięciolecia. Jeśli spojrzysz na pierwszy standard C ++ i postępujesz zgodnie z wersjami, niektóre funkcje są przestarzałe, ale nawet te muszą być nadal obsługiwane. Więc to ma sens projektowanie koncepcji do 100% dopasowanie C ++.
Jak, dlaczego nie została ona uwzględniona w C ++ 0x. Cóż, ponieważ był ogromny. Propozycja była 100 stron długi i bardzo trudny do zrealizowania. Zdecydowano, że ta funkcja potrzebuje więcej czasu na dojrzewanie, dopóki nie zostanie włączona do standardu.
źródło
Po prostu, C ++ ma cholernie dużo bardziej historycznym bagażem niż D. Byłoby znacznie łatwiejsze do wdrożenia bardzo dużo rzeczy, gdyby nie fakt, że C ++ ma ogromne ilości kodu historycznego, który musi nadal działać poprawnie i zgodnie z oczekiwaniami. D nie ma tego problemu.
źródło