Czy nowoczesny C ++ staje się coraz bardziej rozpowszechniony? [Zamknięte]

132

Kiedy po raz pierwszy nauczyłem się C ++ 6-7 lat temu, nauczyłem się w zasadzie „C z klasami”. std::vectorbył zdecydowanie zaawansowanym tematem, o którym można się dowiedzieć, gdyby naprawdę chciał. I z pewnością nikt mi nie powiedział, że destruktory można wykorzystać do zarządzania pamięcią. Dziś wszędzie, gdzie spojrzę, widzę RAII i SFINAE, STL i Boost, a także, cóż, nowoczesne C ++. Nawet osoby, które dopiero rozpoczynają naukę języka, wydają się być uczone tych pojęć niemal od pierwszego dnia.

Moje pytanie brzmi: czy to po prostu dlatego, że widzę tylko „najlepsze”, czyli pytania tutaj na SO i na innych stronach programistycznych, które mają tendencję do przyciągania początkujących (gamedev.net), czy też jest to faktycznie reprezentatywne dla C ++ społeczność jako całość?

Czy nowoczesny C ++ naprawdę staje się domyślnym? Czy zamiast być jakąś wymyślną rzeczą, o której piszą eksperci, staje się „takim, jakim jest C ++”? A może po prostu nie widzę tysięcy ludzi, którzy wciąż uczą się „C z klasami” i piszą własne tablice dynamiczne zamiast używać std::vector, i zarządzają pamięcią, ręcznie wywołując new / delete z ich kodu najwyższego poziomu?

Choć bardzo chcę w to wierzyć, wydaje się niewiarygodne, że cała społeczność C ++ rozwinęła się tak bardzo w ciągu kilku lat. Jakie są Twoje doświadczenia i wrażenia?

(zastrzeżenie: ktoś niezaznajomiony z C ++ może błędnie zinterpretować tytuł jako pytanie, czy C ++ zyskuje na popularności w porównaniu z innymi językami. To nie jest moje pytanie. „Współczesny C ++” to popularna nazwa dialektu lub stylu programowania w C ++, nazwana na cześć książki. Nowoczesny projekt C ++: Zastosowano ogólne programowanie i wzorce projektowe ”, a interesuje mnie wyłącznie to w porównaniu ze„ starym C ++ ”. Nie ma więc potrzeby mówić mi, że czas C ++ minął i wszyscy powinniśmy używać Pythona;))

jalf
źródło
2
Niestety myślę, że minie trochę czasu, zanim społeczność C ++ jako całość będzie wystarczająco zaawansowana, aby rozpoznać, jak używać standardowej biblioteki i ulepszać wraz z nadchodzącymi dodatkami C ++ 0x skutecznie, nie mówiąc już o implementacji kodu przy użyciu podobnych metod. Uważam jednak, że C ++ 0x daje wiele nadziei na zwiększenie popularności C ++. Wiele codziennych niedogodności składniowych zostało poprawionych. Zawsze uważałem te rzeczy za drobiazgi, ale dla ludzi z zewnątrz, którzy patrzą na język, jest to częste źródło skarg.
stinky472
15
W moim przypadku, ilekroć spotykam profesjonalistę, który rozumie współczesne techniki C ++, takie jak RAII i bezpieczeństwo wyjątków (niekoniecznie odnosząc się do książki Alexandrescu) lub nawet najbardziej podstawowe pojęcia, takie jak iteratory i algorytmy generyczne, znajduję dziesięć kolejnych, którzy nie rozumieją. Przynajmniej jeśli chodzi o profesjonalistów, to wielu z nich jest zbyt pochłoniętych terminami, aby dowiedzieć się czegokolwiek, co wiedział, więc nawet samozwańczy profesjonaliści C ++ często muszą się wiele nauczyć. Obawiam się, że stanę się jednym z tych, którzy znają C ++ 0x: muszę się wiele nauczyć i dostosować do tego, a mam terminy do dotrzymania.
stinky472

Odpowiedzi:

76

Oto, jak moim zdaniem ewoluowało.

Pierwszą generacją programistów C ++ byli programiści C, którzy w rzeczywistości używali C ++ jako C z klasami. Poza tym STL nie był jeszcze na miejscu, więc zasadniczo tym był C ++.

Kiedy pojawił się STL, było to zaawansowane, ale większość ludzi piszących książki, składających programy nauczania i prowadzących zajęcia nauczyła się najpierw C, a potem dodatkowych rzeczy C ++, więc drugie pokolenie uczyło się z tej perspektywy. Jak zauważono w innej odpowiedzi, jeśli czujesz się komfortowo, pisząc regularnie w pętlach, zmiana na użycie std::for_eachnie kupi ci wiele, z wyjątkiem ciepłego, rozmytego wrażenia, że ​​robisz rzeczy w „nowoczesny” sposób.

Teraz mamy instruktorów i autorów książek, którzy używali całego C ++ i otrzymywali instrukcje z tej perspektywy, na przykład Accelerated C ++ firmy Koenig & Moo i nowy podręcznik Stroustrupa. Więc nie uczą char*potem std::strings.

To interesująca lekcja na temat tego, ile czasu zajmuje zastąpienie „starszych” metod, zwłaszcza jeśli mają one udokumentowaną skuteczność.

JohnMcG
źródło
13
Tak. Bardzo sprytnie było uczynić C ++ wysoce kompatybilnym wstecz z C ze względu na ogromną liczbę zainstalowanych programistów C. Bardzo podobny do skutecznej strategii MS polegającej na utrzymywaniu wstecznej kompatybilności z DOS. (Zobacz doskonały blog Raymonda Chena, aby zobaczyć, jak często bolesne
wysiłki podejmowali
2
Ups, poszedłem trochę stycznie ... Chciałbym powiedzieć, że myślę, że masz rację co do „podziału pokoleniowego” między tymi, którzy przeszli z C (ale zachowali myślenie w stylu C) i tymi, których „pierwszy gust ”był post-STL C ++.
j_random_hacker
57

Zdecydowanie tak. Dla mnie, jeśli nie programujesz C ++ w stylu „nowoczesnego C ++”, jak to określasz, to nie ma sensu używać C ++! Równie dobrze możesz po prostu użyć C. „Nowoczesne C ++” powinno być moim zdaniem jedynym sposobem programowania C ++ i spodziewałbym się, że każdy, kto używa C ++ i programuje w ten „nowoczesny” sposób, zgodzi się ze mną. W rzeczywistości zawsze jestem całkowicie zszokowany, gdy słyszę o programistę C ++, który nie jest świadomy takich rzeczy, jak auto_ptr lub ptr_vector. Jeśli o mnie chodzi, te pomysły są podstawowe i fundamentalne dla C ++, więc nie wyobrażam sobie tego w żaden inny sposób.

Ray Hidayat
źródło
4
+1; Wcześnie podjąłem styl „nowoczesnego c ++”, ponieważ jest to naturalny sposób (jeśli nie myślisz o C z klasami).
Adam Hawes
21
„Po prostu użyj C?” C jest cholernie potężny.
Clark Gaebel
4
Roboty z pewnością nie będą programować w C ++, nie są wystarczająco głupie i zawiesiłyby się, próbując je skompilować.
Matt Joiner
6
@ClarkGaebel Dobrze, jeśli C jest potężny, więc jest C ++ przez jego dziedziczenia z C bez jego problemów :)
legends2k
4
@rxantos, mówisz, że tak jak my nie mamy zbyt wielu opcji do oceny wydajności, np. przeglądanie wyjścia zespołu, timerów, monitorów RAM i wielu innych. Pod tym względem C ++ nie różni się od C. W razie wątpliwości profil. Wszystko inne to tylko pogłoski.
underscore_d
25

W czasach Windows 3.1 C było standardem. Kiedy C ++ trafił na rynek deweloperów, a później stał się standardem ANSI, był to nowy trend. Spopularyzował akronim OOP i niektóre z podstawowych wzorców projektowych wykorzystujących polimorfizm.

Teraz, przy większej akceptacji platform zarządzanych o niskich barierach wejścia, takich jak C # / .NET, nie ma powodu, aby używać C ++. Tak duża część programistów będzie miała wybór i bądźmy szczerzy: C ++ to niedźwiedź, którego trzeba się nauczyć dla nowicjusza. Dzięki C # możesz po prostu z tym biegać.

To pozostawia tylko platformy, które POTRZEBUJĄ C ++ i zagorzałych ewangelistów C ++ do kontynuowania ćwiczenia tej sztuki. To społeczność, która potrzebuje i chce wszystkich warstw abstrakcji, które są uważane za „nowoczesne C ++”.

Więc tak, uważam, że „nowoczesny C ++”, jak to określasz, staje się coraz bardziej rozpowszechniony. Chociaż jest to powszechne w przypadku innych odbiorców niż w przeszłości.

spoulson
źródło
No dalej, ta odpowiedź ma kilka dobrych punktów. C ++ nie jest doskonały, wszyscy to wiemy, sam Bjarne narzeka, że ​​jest zbyt duży i zbyt trudny do nauczenia. Chociaż nie zgadzam się co do tego, dlaczego współczesny C ++ pojawiał się tak stopniowo - IMHO tak długo trwa, zanim tak duży język „dudni do przodu”.
j_random_hacker
4
Więc mówisz, że bardziej przeciętni programiści skierowali się do C # i tym podobnych, podczas gdy bardziej hard-core trzymali się C ++? (Nie znaczy to, że nie ma naprawdę inteligentnych ludzi z C # / .NET, ale jest dużo mniej inteligentnych). Ma to pewien sens.
David Thornley
3
Myślę, że to ważny punkt. Oczywiście nie dotyczy to wszystkich, ale w dużej mierze zgadzam się, większość ludzi, którzy mają wybór, wybrała już C # lub Javę lub inne tego typu języki.
jalf
3
Przypadki użycia: Chcę, aby klient Windows wykonywał CRUD na mojej bazie danych. Używać C # / .NET lub C ++ / MFC? Chcę aplikację internetową ... Używać C # / ASP.NET lub C ++ / ISAPI? Chcę prosty klon „Nybbles” przy użyciu DirectX C # / .NET lub C ++ / MFC / WTL? Chcę zwycięskiej wersji demonstracyjnej na Assembly09 ... zdecydowanie C ++ (w porównaniu z C #).
spoulson
8
Nie wiem, czy jest to kwestia większej liczby warstw abstrakcji, czy bardziej zagorzałości. Podejrzewam, że po prostu rodzaje abstrakcji dostępne za pośrednictwem szablonów po prostu nie były dostępne w Javie lub C #, więc ludzie, którzy je lubili lub potrzebowali, pozostali przy C ++.
Kragen Javier Sitaker
16

Jestem jednym z tych gości, którzy nauczyli się pracować z STL i słyszeli dużo o RAII i dobrych praktykach programowania w C ++ od pierwszego dnia. Wygląda na to, że niektóre z najbardziej polecanych książek do nauki języka C ++ dzisiaj (jak Accelerated C ++ i Effective C ++ ) skup się na używaniu narzędzi STL zamiast zwijania własnych rzeczy, a także podaj wiele „reguł” efektywnego (lub „nowoczesnego”) programowania.

Ale rozmawiając ze znajomymi zauważyłem również, że niektóre firmy nadal używają „C with Classes”, a nie „Modern C ++”. Może kiedyś zapanuje kultura proponowana przez autorów i użytkowników „Nowoczesnego C ++” :)

jfsantos
źródło
Tam, gdzie pracuję, nadal używamy C z klasami, prawdopodobnie dlatego, że jest wielu starych timerów, którzy są tam przez jakiś czas. Wydają się bardzo nieufni nawet wobec STL, nie mówiąc już o BOOST.
aneccodeal
12

Myślę, że zaczynasz od złego doświadczenia.

Musisz zdobyć książki Scott Meyers Effective C ++. Zacząłem od C ++ w złości w 1999 roku, mój szef zespołu kazał mi siedzieć i czytać Efektywny C ++ i Bardziej efektywny C ++, zanim pozwolono mi sprawdzić JAKIEKOLWIEK kod.

Większość jego rad brzmi „Nie używaj tej funkcji , ale jeśli musisz, miej to na uwadze”

Jeśli zastosujesz się do jego rad, napiszesz dobry lub „nowoczesny” C ++.

Ma teraz też książkę o STL, ale jej nie czytałem.

Binary Worrier
źródło
Powinienem wspomnieć, że to był dopiero mój punkt wyjścia. Dziś czuję się bardzo dobrze z STL, boostem, RAII i wszystkim innym. Po prostu zastanawiałem się, jak powszechne było moje początkowe doświadczenie.
jalf
9

Podczas moich prac w C ++ odkryłem, że nowoczesne funkcje są coraz częściej używane i więcej osób pytało mnie o nie podczas pokazów telefonicznych i wywiadów. O ile wiem, przyjmują.

Nauczyłem się C ++ początkowo jako coś w rodzaju C z klasami; chociaż język znacznie się rozwinął, książki, które czytałem i ludzie, z którymi pracowałem, mocno utknęli na „starym C ++”. RAII coś, o czym ludzie pomyśleliby, zamiast robić automatycznie, i pamiętam, że czytałem niektóre z wczesnych artykułów na temat problemów bezpieczeństwa wyjątków.

Jak już wspomniano, są teraz dostępne nowe książki. Wiele starych nadal jest aktualnych, ale wydaje się, że coraz częściej zawierają one wyjaśnienia, dlaczego oczywiście złe pomysły są złe. (Podobnie, współczesnym czytelnikom trudno jest zrozumieć, jak rewolucyjne były idee Freuda dotyczące nieświadomego umysłu, ponieważ jest to teraz konwencjonalna mądrość).

Stroustrup właśnie wydał podręcznik, Programming: Principles and Practice Using C ++ . Kupiłem go, ponieważ jeszcze nie zawiodłem się w nauce dobrych rzeczy z książki Stroustrupa, ale nie udało mi się przejść przez kilka pierwszych rozdziałów. Jak dotąd, wszystko, co mogę powiedzieć, to to, że podoba mi się sposób, w jaki zaczął, i jest to przynajmniej dobre wprowadzenie do tego, jak powinno się używać C ++.

David Thornley
źródło
Nawet pierwsze wersje STL nie były bezpieczne.
Kragen Javier Sitaker
2
W tamtym czasie nikt tak naprawdę nie wiedział, jak pisać kod bezpieczny dla wyjątków. Zostało to opracowane w latach następujących po opublikowaniu normy. Pamiętam niektóre artykuły w C ++ Report.
David Thornley
7

Podczas pracy nad projektem, w którym jestem obecnie zaangażowany, jest dużo kodu C ++, który ewoluował przez znaczny okres czasu (ponad 10 lat). Ewolucja, o której mówisz, jest tam wyraźnie widoczna: starszy kod to często „C z klasami” - surowe wskaźniki, char*ciągi znaków i użycie powiązanych funkcji C, tablic itp .; nowszy kod wykorzystuje inteligentne wskaźniki ATL i tym podobne do zarządzania zasobami, ale przez większość czasu trzyma się ręcznie zakodowanych pętli, a iterator jest rzadkim widokiem; a najnowszy jest pełen kontenerów STL, algorytmów,shared_ptr(w tym niestandardowe narzędzia do usuwania do zarządzania uchwytami itp.), mocno uogólnione szablony funkcji i klas itd. Większość tradycyjnych technik kodowania „C z klasami”, takich jak surowe wskaźniki niezakapsułkowane z ręcznym zarządzaniem okresem życia, jest obecnie bardzo źle widziana w recenzjach kodu. Sądząc po tym, wydaje się, że twoja obserwacja jest dokładna.

Najnowszy rozwój wydaje się być modą dla lambd C ++ 0x - co ma pozytywną stronę, ponieważ przechyla równowagę na korzyść stosowania standardowych algorytmów zamiast ręcznie kodowanych pętli, ponieważ teraz możesz mieć cały kod w linii algorytmy.

Pavel Minaev
źródło
6

Nie powiedziałbym, że obecnie std :: vector kwalifikuje się jako „nowoczesny”. To jest naprawdę proste.

Ogólnie mam wrażenie, że ludzie zdobyli pewne doświadczenie z nowoczesnym stylem C ++ i trochę otrzeźwili. Aby wziąć prosty przykład, STL for_each był interesujący, ale w praktyce nie dodaje strasznej wartości do zwykłej pętli C. Debugowanie jest trudniejsze, a czasami nie zapewnia najlepszej wydajności. Również konstrukcje programowania funkcjonalnego w aktualnym STL są ogólnie bardzo uciążliwe, zwłaszcza jeśli masz doświadczenie z prawdziwym językiem funkcjonalnym, takim jak ML.

Johan Kotlinski
źródło
1
dlaczego mówisz, że wektor nie kwalifikuje się jako nowoczesny? nadal jest to najnowocześniejszy w wielu przypadkach użycia, mimo że jest podstawowy. ale myślę, że coś podstawowego nie oznacza, że ​​nie jest nowoczesne. raczej odwrotnie, jeśli już. ale myślę, że zgadzam się z twoim drugim akapitem :)
Johannes Schaub - litb
4
ale myślę, że dzieje się tak dlatego, że niektórzy ppl próbują używać for_each i znajomych w zasadzie do wszystkiego, nawet do rzeczy, w których prosta pętla for byłaby o wiele bardziej zwięzła - rozdęcie pętli 2-liniowej do 10 linii. Spodziewam się, że więcej osób będzie używać for_each i znajomych, gdy lambda będzie dostępna w C ++ 1x, chociaż
Johannes Schaub - litb
7
właśnie chodzi o wektor będący podstawowym. Nie zawsze było to podstawowe. Kiedyś był powszechnie postrzegany jako bardzo skomplikowany (używał SZABLONÓW) i nieefektywny (nie jest to tablica surowa). Coś, o czym mogliby głosić eksperci, ale wielu ludzi po prostu nie ufa.
jalf
2
Może dlatego, że std :: for_each rzadko jest tym, czego potrzebujesz, w porównaniu z powiedzeniem ... std :: transform? Korzystanie z algorytmu pomaga pozbyć się jednego bardzo częstego błędu: nieprawidłowego stanu pętli.
Edouard A.
wektor <bool> z pewnością nie jest podstawowy ...
Kugel,
6

Z mojego doświadczenia (Uniwersytet Hiszpański) niestety wynika, że ​​normą jest nie branie pod uwagę języków jako takich. Używają najłatwiejszych języków do nauki programowania (tj. Java), ponieważ ma to być łatwe dla nauczycieli i uczniów, a potem używają C do zajęć z OS i tym podobnych.

C ++ jest wprowadzany bardzo nieznacznie (w każdym razie w każdym kursie), aby zapewnić C z klasami. Nie dostają doładowania ani nawet STL. Myślę, że nadążanie za wszystkimi cechami i sposobem myślenia C ++ jest kosztowne zarówno dla nauczycieli, jak i dla uczniów. Ilu z obecnych tutaj programistów C ++ wie wystarczająco dużo o wszystkich bibliotekach Boost, aby używać ich do oferowania lepszych rozwiązań lub ich projektowania? Trzeba mieć zainteresowanie nadążaniem za wszystkimi nowymi bibliotekami i idiomami.

Jednak, jak powiedziałem, wydaje się, że programowanie w ogóle (a języki programowania w szczególności) nie są traktowane zbyt poważnie, ponieważ wydaje się, że jest to zadanie czasowe, gdy rozpoczynają pracę, a potem zapominają, jak programować, gdy idą w górę w drzewo przedsiębiorstw. Wiele przedsiębiorstw tutaj i sam uniwersytet ma poczucie, że programowanie może być zrobione przez każdego.

Jeśli zastosujesz się do tej filozofii, to dla większości ludzi, których znam, C ++ będzie zawsze „C z klasami”.

Pozdrowienia,

Diego Sevilla
źródło
Większość z nich jest bardzo powszechna w informatyce i ogólnie nie sądzę, że jest to zła rzecz. (To znaczy nie skupiając się na języku. Języki, których się uczy, powinny oczywiście nadal być nauczane prawidłowo).
jalf
+1: „(To znaczy, nie koncentrując się na języku. Języki, których naucza się, powinny oczywiście nadal być nauczane właściwie)”
Jared Updike,
6

Z mojego doświadczenia wynika, że ​​w dużej mierze zależy to od wieku produktu / projektu oprogramowania. Większość nowych projektów, o których wiem, używa nowoczesnego C ++ (RAII, STL, Boost). Jednak istnieje wiele projektów C ++, które mają więcej niż 10 lat i nie widać tam nowoczesnego C ++.

Należy również pamiętać, że niektóre z najpopularniejszych implementacji STL były prawie zepsute do może 5 lat temu (MSVC <7,0 i GNU <3,00)

Nemanja Trifunovic
źródło
4

Myślę, że największą barierą, jaką napotkałem, jest obsługa toolchain, zwłaszcza w projektach wieloplatformowych. Jeszcze kilka lat temu często spotykało się notatki dotyczące kompilacji, które mówiły, że „platforma x potrzebuje do działania STLport, ponieważ ich kompilator jest zepsuty”. Nawet teraz widzę problemy z ludźmi próbującymi używać wielu zależności innych firm powiązanych z różnymi wersjami BOOST. To sprawia, że ​​linkowanie jest niemożliwe, co oznacza, że ​​musisz wrócić i odbudować swoje deps od zera.

Teraz, gdy prawie wszyscy przestali używać MSVC ++ 6, bałagan STLport jest za nami. Ale gdy tylko TR1 wyjdzie na zewnątrz, wrócimy do „które wersje i środowiska obsługują go i poprawią” i po raz kolejny spowolni to adopcję.

Pracuję nad projektem rozpoczętym w C (nie C ++) w 1992 roku. Wdrażanie nowoczesnych praktyk w starym kodzie byłoby niemożliwe. Podobnie pracuję nad innym projektem, który jest znacznie bliższy nowatorskiemu językowi C ++.

XenonofArcticus
źródło
3

Wiele zespołów, w których byłem i o których słyszałem, uważa, że ​​„czy używamy wyjątków?” pytanie. To jest kod „czy używamy nowoczesnego C ++?”

Gdy nie używasz wyjątków, nie możesz korzystać z pełnej mocy języka i jego bibliotek.

Ale wiele starszych baz kodów jest pozbawionych wyjątków i uważa się, że trudno jest wprowadzić wyjątki do bazy kodu, która ich nie oczekuje, lub do zespołu, który nie wie, jak ich używać, więc w takich przypadkach odpowiedź brzmi: często „nie”.

Z mojego doświadczenia wynika, że ​​współczesny C ++ potrzebuje kogoś, kto jest tym pasjonatem w zespole, który nie może znieść widoku niczego mniej, aby to popchnąć. Musi także przezwyciężyć obiekcje tych, którzy chcą, aby był bardziej podobny do starego kodu.

Chociaż nie sądzę, aby stare bazy kodów C ++ znikały bardzo szybko, uważam, że na świecie jest więcej takich pełnych pasji ludzi niż pięć lat temu. Stają w obliczu tej samej żmudnej bitwy, jaką stoczyli pięć lat temu, ale są bardziej skłonni do znalezienia pokrewnych duchów.

Drew Hoskins
źródło
3

Zanim odpowiesz na takie pytanie, musisz zgodzić się, czym jest „nowoczesny”. Tak się nie stanie, ponieważ „nowoczesny” jest słabo zdefiniowanym słowem i oznacza różne rzeczy dla różnych ludzi. Tytuł książki Alexandrescu (Modern C ++ Design) również nie pomaga, ponieważ jest to w dużej mierze książka o metaprogramowaniu szablonów, która jest specyficznym obszarem C ++, ale bynajmniej nie jedynym.

Dla mnie „Nowoczesne C ++”! = „Metaprogramowanie szablonów”. Powiedziałbym, że funkcje C ++ ponad C należałyby do następujących kategorii:

  • Klasy (konstruktorzy, niszczyciele, RAII, dynamiczne rzucanie i RTTI)
  • Wyjątki
  • Bibliografia
  • Struktury danych i algorytmy w bibliotece standardowej (STL)
  • iostreams
  • Proste szablony klas i funkcji
  • Metaprogramowanie szablonów

Żaden z nich nie jest szczególnie nowoczesny, ponieważ wszystkie mają już prawie 10 lat lub więcej. Większość z tych funkcji jest przydatna i w wielu przypadkach pozwoli Ci być bardziej produktywnym niż zwykłe C. Dobry programista powinien i będzie używał ich wszystkich w solidnym projekcie, ale jedna z tych rzeczy nie jest podobna do drugiej:

Metaprogramowanie szablonów.

Krótka odpowiedź na metaprogramowanie szablonów brzmi po prostu nie. Niestety dla niektórych ludzi jest to synonim „nowoczesnego programowania w C ++”, z powodu książki, ale ostatecznie stwarza więcej problemów niż rozwiązuje. O ile C ++ nie rozwinie lepszych ogólnych mechanizmów programowania, takich jak odbicie, będzie źle dostosowany do programowania ogólnego, a języki wyższego poziomu, takie jak Python, będą lepiej pasować do tych przypadków użycia. Z tego i wielu innych powodów zobacz C ++ FQA

Anton I. Sipos
źródło
6
Metaprogramowanie szablonów IMHO prawie nigdy nie jest potrzebne do programowania aplikacji , gdzie służy jedynie do zapewnienia prawdopodobnie niepotrzebnych poziomów ogólności kosztem czytelności i trudnych do zrozumienia błędów. Ale OTOH jest niezwykle przydatny dla ekspertów podczas budowania bibliotek (a la Boost), gdzie dodatkowa ogólność jest przydatna, a (brzydkie, podstępne, zagmatwane) mechanizmy można ukryć.
j_random_hacker
3
Masz rację, że metaprogramowanie szablonów może być gustownie używane, jeśli jest wykonywane z umiarem, szczególnie w bibliotekach. Ale zbyt często widziałem ludzi, którzy zbytnio zeszli na ścieżkę metaprogramowania szablonów, w wyniku czego ich programy cierpiały. Nie jestem przeciwny metaprogramowaniu, w rzeczywistości jestem jego zdecydowanym zwolennikiem, po prostu możliwości C ++ do tego są dość prymitywne.
Anton I. Sipos
2

Najlepsza książka do nauki C ++. „Accelerated C ++” autorstwa Koenig & Moo uczy tego, co określasz jako współczesne C ++, więc myślę, że obecnie większość ludzi go używa. Dla tych z nas, którzy używają C ++ od dłuższego czasu (od połowy lat 80. w moim przypadku), nowoczesny C ++ jest wielką ulgą od żmudnych zadań pisania własnych tablic, ciągów znaków, tablic mieszających (powtarzaj do znudzenia).

zaraz
źródło
1
Nie chcę nekro, ale właśnie kupiłem książkę na podstawie tej rekomendacji. Będziemy musieli zobaczyć!
Andrew Weir,
2

Zajrzałem do C ++ Jobs w rzeczywistości i „nowoczesne” biblioteki są coraz częściej używane w opisach zadań, MFC, które jest dość „staromodną” biblioteką c ++, jest rzadziej używane.

Rexxar
źródło
1

Standaryzacja języka pod koniec lat 90. była pierwszym krokiem, pozwoliła twórcom kompilatorów skupić się na „standardowym” zestawie funkcji, a także pozwoliła językowi naprawić niektóre nierówności, które pojawiły się w procesie standaryzacji.

To z kolei pozwoliło na tworzenie frameworków opartych na standardowych cechach języka, a nie na funkcjach dostarczanych przez konkretną implementację kompilatora. Biblioteka Boost jest szczególnie pod tym względem. Pozwoliło to również na oparcie nowego rozwoju na wcześniejszych pracach, umożliwiając w ten sposób rozwiązania bardziej złożonych problemów.

Istotną zmianą w tym miejscu jest sposób, w jaki wcześniej platformy były oparte na pojęciu klas bazowych i klas pochodnych (funkcja czasu wykonywania). Jednak obecnie najbardziej zaawansowane funkcje są często w dużym stopniu oparte na szablonach „rekurencyjnych” (funkcja czasu kompilacji).

STL ma swoje wady i zalety, ale przetrwał próbę czasu, jeśli chcesz czegoś, co działa i jest proste, STL z pewnością ma coś, co pomoże Ci zacząć. Nie ma sensu odkrywać koła od nowa (chyba że ze względów dydaktycznych).

Sprzęt komputerowy również zrobił wielkie postępy w stosunku do lat 90. XX wieku, wtedy pamięć i procesor nie są już ograniczeniem dla kompilatora. Zatem większość teoretycznych optymalizacji z książek jest teraz możliwa.

Kolejne kroki języka to wsparcie programowania wielordzeniowego, które jest częścią standardowych wysiłków 0x.

Ismael
źródło
1

Tak i nie. Z pewnością w przypadku nowych projektów jest coraz bardziej popularny. Jednak nadal istnieją bariery praktyczne, a nie polityczne, o których inni nie wspominali. Istnieje wiele komercyjnych bibliotek C ++, które używają ABI ze starożytnych kompilatorów, które nie obsługują poprawnie funkcji występujących w nowoczesnym C ++, a wiele firm polega na tych bibliotekach. Na przykład Sun Studio w systemie Solaris nie może współpracować z Boost bez użycia STLport, ale każda komercyjna biblioteka innej firmy, której chcesz użyć, będzie wymagać wersji STL firmy Sun. Ta sama historia z GCC 2.95 i Redhat Enterprise Linux.

Joseph Garvin
źródło
-3

To niesamowite, jak mało wysiłku wymaga uczynienie c ++ bardziej stabilnym. System ostrzegania jest na miejscu, ale niewiele się zmienia. Jeszcze łatwiej jest strzelić sobie w stopę niż 10 lat temu. Nie wiem dlaczego, ale c ++ jest nadal moim ulubionym językiem. :)

AareP
źródło
Sugerowałbym przeczytanie kilku książek w tym wątku przed stwierdzeniem, że "mały wysiłek" włożony jest w stabilizację C ++ i że "jest jeszcze łatwiej strzelić sobie w stopę niż 10 lat temu".
Patrick Niedzielski
Jasne, biblioteka std zapewnia pewną stabilność w zakresie alokacji pamięci i manipulacji ciągami. Niestety wewnętrznie używa tak dziwnych konwencji kodowania, że ​​można by pomyśleć, że został napisany przez kosmitów lub coś w tym rodzaju. :)
AareP
2
Ponieważ biblioteka standardowa jest specyfikacją, winić producenta kompilatora za używanie dziwnych wewnętrznych konwencji kodowania. A poza tym dziwne konwencje kodowania = / = niestabilne lub łatwiejsze do strzelenia sobie w stopę. Większość z tych konwencji kodowania (mówiąc przynajmniej o bibliotece MSVC, a prawdopodobnie także o innych) jest zaprojektowana tak, aby w ogóle Ci nie przeszkadzać, więc możesz robić głupie rzeczy, a biblioteka nie musi się tym przejmować. Jeśli kodujesz poza specyfikacją C ++, to jest inna sprawa.
Patrick Niedzielski
Zwróć uwagę, że typowa implementacja STL (zwłaszcza jeśli jest dołączona do określonego kompilatora) nie musi używać standardowego C ++ do implementacji. Może bardzo dobrze wykorzystać wewnętrzną wiedzę specyficzną dla implementacji, aby zapewnić Twojemu kodowi gwarancje obiecane przez Standard. Twój własny kod powinien jednak trzymać się tylko tego, co gwarantuje Standard. Nie można nauczyć się gwarancji standardowych, badając konkretną implementację języka C ++ lub STL.
Tanz87,
Ta odpowiedź została napisana dziesięć lat temu. W tamtym czasie zdumiewające było, jak wiele wysiłku włożono w uczynienie c ++ bardziej stabilnym. To był jeden z głównych powodów, dla których wydanie c ++ 0x jako c ++ 11 trwało tak długo.
David Hammen