Harmi kyllä, standardointikomitea on äänestänyt concept-rakenteiden hylkäämisen puolesta, eikä niitä tule C++0x:ään, eli seuraavaan C++-standardiin. Syyt hylkäämiseen ovat varmasti olemassa ja käytä tarkasti läpi, joten ei voi kuin surkutella, että konseptien suunnittelijoiden hyvät aikeet eivät toteutuneet.
Tässä juttu:
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=441
Yksi ongelma nykyisessä C++-template-ohjelmoinnissa on se, että käytännössä jokainen kääntäjä antaa aivan käsittämättömiä virheilmoituksia, kun tekee jotakin monimutkaista väärin. Syytä saa sitten etsiä ihan itse. Löytyy se joskus sieltä virheilmoitussarjan alkupäästä se syy, jos käy hyvä tuuri. Sitten tulee tuhat muuta :)
Boost-kirjastoihin tutustuneet tuntevat eräitä template-metaohjelmointiominaisuuksia, joita siinä on toteutettu. Se kaikki olisi voinut olla paljon helpompaa tulevaisuudessa, jos konsepti-lupaukset olisivat pitäneet. Ei näköjään käynyt ihan niin hyvin...
Uuteen C++:aan tulee kuitenkin vaikka mitä hyödyllistä uutta ominaisuutta, mikä lienee meistä useimmista hyvä asia. Ja osaahan niistä voi jo tänään käyttää uusimmissa kääntäjien versioissa. Jos on niinku hirvee hoppu.
(Concept olisi ehkä parempi suomentaa käsitteeksi. Eipä sitä nyt tarvitse tässä yhteydessä suomentaakaan.)
Näinköhän tuo koko standardi ehtii tänä vuonna julki... Taitaa vielä muuttua C++1x:ksi.
Konseptit jäivät, mutta lukuisia muita uusia ominaisuuksia kuitenkin tulee. Kieli paisuu ja mutkistuu entisestään, ja itsekin alan yksinkertaisuuden nimissä taipua Javan kannalle. :)
Kysynpä nyt kaikilta, jotka sattuvat tämän lukemaan: Pitäisikö Ohjelmointiputkan C++-oppaan käsitellä uuden standardin ominaisuuksia vanhojen seassa, vai onko parempi tehdä niistä aivan erillisiä oppaita?
Metabolix kirjoitti:
Kysynpä nyt kaikilta, jotka sattuvat tämän lukemaan: Pitäisikö Ohjelmointiputkan C++-oppaan käsitellä uuden standardin ominaisuuksia vanhojen seassa, vai onko parempi tehdä niistä aivan erillisiä oppaita?
Taitaa mennä aika kauan ennen kuin uudet ominaisuudet saadaan kääntäjien vakaisiin versioihin.
Itseäni harmittaa tuossa ennen kaikkea, että tämän seurauksena luultavasti standardista jäävät pois myös rangeihin perustuvat for-loopit ja standardikirjaston algoritmit, sillä kummatkin näistä nojaavat selvästi konsepteihin. Käsittääkseni konsepteilla ei voida tehdä mitään, mihin ei SFINAE pystyisi (paitsi se virheilmoitusten selventäminen), mutta SFINAEn käyttäminen standardikirjastossa tässä kohtaa tuottaisi varmaan selvästi epäsiistimpiä ratkaisuja.
Boostin purkat varmaan vähenevät huomattavasti jo variadic templaattien ansiosta, sillä monet nykyiset esikäsittelijän suorittamaan kopypasteamiseen perustuvat kikkailut saadaan varmaan helpohkosti korvattua niillä. Tämä ei kuitenkaan tosiaan auta vielä niiden monisivuisten virheilmoitusten kanssa, jotka tulevat jokaisesta pikkuvirheestä, kun käyttää raskaasti templaatteja hyödyntäviä kirjastoja, kuten Boost.Spirit ja Boost.Lambda. Itse olen jossain määrin tottunut näiden dekryptaamiseen, mutta monelle aloittelijalle ne tuskin ovat kovin mukava näky.
Metabolix kirjoitti:
Näinköhän tuo koko standardi ehtii tänä vuonna julki... Taitaa vielä muuttua C++1x:ksi.
Oli käsittääkseni suunnitelmissa jo ennestään että standardi tulisi vasta 2010, vaikka 0x-nimitystä käytetäänkin vielä monessa paikassa. Nyt veikkaisin että saadaan odottaa vielä ainakin vuosi tai pari enemmän.
Metabolix kirjoitti:
Kysynpä nyt kaikilta, jotka sattuvat tämän lukemaan: Pitäisikö Ohjelmointiputkan C++-oppaan käsitellä uuden standardin ominaisuuksia vanhojen seassa, vai onko parempi tehdä niistä aivan erillisiä oppaita?
C++0x:ää C++98:a osaaville tulee varmaan ihan tarpeelliseksi oppaaksi, joten tässä mielessä erillinen opas olisi ihan hyvä. Kuitenkin siinä vaiheessa kun standardi alkaa olemaan kunnolla tuettu kaikilla merkittävillä alustoilla, niin mielestäni vanhoja ja uusia asioita ei ole tarvetta rajata erilleen, kunhan alussa on joku maininta että päivitä kääntäjäsi jos ei toimi. Tällä hetkellä olisin kuitenkin vielä erillisten oppaiden kannalla.
Sisuaski kirjoitti:
Metabolix kirjoitti:
Kysynpä nyt kaikilta, jotka sattuvat tämän lukemaan: Pitäisikö Ohjelmointiputkan C++-oppaan käsitellä uuden standardin ominaisuuksia vanhojen seassa, vai onko parempi tehdä niistä aivan erillisiä oppaita?
C++0x:ää C++98:a osaaville tulee varmaan ihan tarpeelliseksi oppaaksi, joten tässä mielessä erillinen opas olisi ihan hyvä. Kuitenkin siinä vaiheessa kun standardi alkaa olemaan kunnolla tuettu kaikilla merkittävillä alustoilla, niin mielestäni vanhoja ja uusia asioita ei ole tarvetta rajata erilleen, kunhan alussa on joku maininta että päivitä kääntäjäsi jos ei toimi. Tällä hetkellä olisin kuitenkin vielä erillisten oppaiden kannalla.
Samaa mieltä tästä. C++0x:n vakiintumisessa on vielä monta mutkaa matkassa. Lisäksi kunnollinen 98 -> 0x -opas olisi erinomaista käyttistä lukuisille itseni kaltaisille henkilöille, joilta 98 taittuu enemmän tai vähemmän hyvin, mutta 0x:stä ei (vielä) ole mitään käryä.
Metabolix kirjoitti:
Kieli paisuu ja mutkistuu entisestään, ja itsekin alan yksinkertaisuuden nimissä taipua Javan kannalle. :)
Mutta varmaankin vanhat osat pysyvät samoina. Ei koodaamista varten tarvitse tuntea kaikkea kielen hienouksia, vaan ne rakenteet, joilla pystyy tekemään tarvittavat asiat mukavasti. Toisten koodin ylläpito tietysti vaikeutuu, jos uusia ominaisuuksia tulee vastaan.
Ketju comp.std.c++:ssa.
Isoin syy konseptien poisjättämiseen oli, että standardin valmistuminen olisi vienyt liian kauan. Ne saatetaan kuitenkin lisätä seuraavaan versioon joskus tulevaisuudessa.
Uudet for
-loopit pysyvät standardissa, ne vain toteutetaan ilman konsepteja.
Tässä vielä Bjarne Stroustrupin kommentit aiheesta. C++1X:stä hänkin jo puhuu.
Bjarne Stroustrup kirjoitti:
The experimental implementation was sufficient to test the "conceptualized" standard library, but was not production quality. The latter worried some people, but I personally considered it sufficient as a proof of concept.
Hehehe.
Metabolix kirjoitti:
Kysynpä nyt kaikilta, jotka sattuvat tämän lukemaan: Pitäisikö Ohjelmointiputkan C++-oppaan käsitellä uuden standardin ominaisuuksia vanhojen seassa, vai onko parempi tehdä niistä aivan erillisiä oppaita?
Kannattaa varmaankin kiinnittää eniten huomiota niihin ominaisuuksiin, mitä aiotaan deprekoida. Voi ainakin varoittaa, että tätä ei kannata oppia ikuisena totuutena niiden kohdalla. Auto_ptr taitaa olla yksi, ainakin se tieto on pitkään kellunut täällä Wikipedia-artikkelissa:
http://en.wikipedia.org/wiki/C++0x
Muuten tietenkin uusia ominaisuuksia korkeintaan sen verran kuin itse käytät :)
Tässä vähän käryä parista mukavasta ominaisuudesta.
#include <iostream> #include <string> #include <vector> int main() { std::vector<std::string> sv { "Ohjelmointiputka", "on", "tosi", "jees"}; for (auto iter = sv.begin(), end = sv.end(); iter != end; ++iter) std::cout << *iter << std::endl; return 0; }
Tämä kääntyy ilman varoituksia näin gcc-4.4.0:lla:
g++ test1.cpp -Wall -std=c++0x
Tässä on nyt kaksi uutta ominaisuutta, nimittäin alustuslistat, joilla voi mm. kätevästi luoda vektorin suoraan valmiiksi. Ne ovat tyyppiä std::initializer_list<T>
, joten nyt voi luoda funktioita ja konstruktoreita, jotka ottavat näitä vastaan parametreina. Yksi pieni mutka säästyy monesta paikasta.
Auto(maattiset) muuttujat ovat sellaisia, joiden tyypin voi päätellä niiden alustamistavasta. Ei tarvitse turhaan kerrata kääntäjälle taas kerran, että joo, merkkijono-vektoria minä käsittelen. Kiitos kysymästä. Nykyään se hoksaa sen itse.
Aiheesta voisi tehdä oman ketjun, jos jollakulla on enemmän harrastusta aiheeseen jo nyt. Minulla ei nyt ole sitä harrastusta vielä eikä oikein aikaakaan syvälliseen esittelyyn. Vaikkapa Herb Sutterin blogista löytää käytännön esimerkkejä ominaisuuksista, joita gcc ei vielä tue.
http://herbsutter.wordpress.com/
Tässä on lyhyt maininta ns. lambda-funktioista, joita onkin jo odotettu joissain piireissä kieli pitkänä vuodesta miekka ja reikäkortti asti.
http://herbsutter.wordpress.com/2008/03/29/trip-report-februarymarch-2008-iso-c-standards-meeting/
Olio-ohjelmointiin tottunut voi ajatella näistä, että (lambda-)funktio on olio, jolla on vain yksi mielenkiintoinen metodi, nimittäin funktiokutsu. Näitä voi nyt määritellä juuri siellä, missä niitä tarvitaan. Ei tarvitse luoda omaa luokkaa jokaiselle pikku operaatiolle, kuten STL:n kanssa opetetaan tekemään (yhtenä vaihtoehtona).
Tietenkään ei tarvitse muistuttaa, että wanha ja wakaa C++ on yhä vahva kieli pitkän aikaa. Mutta meni muistutuksen puolelle. Sorry.
Aihe on jo aika vanha, joten et voi enää vastata siihen.