Ar modernaus C ++ eksperimentiniai pajėgumai yra ilgalaikiai projektai?

Turiu projektą, kuris šiuo metu naudoja C ++ 11/14, bet tam reikalingas kažkas panašaus į std::filesystem , kuri yra prieinama tik C ++ 17, todėl neturiu galimybės ją naudoti. Tačiau matau, kad tai yra mano dabartiniame kompiliatoriuje kaip std::experimental::filesystem . Ar gera idėja naudoti eksperimentines funkcijas, o tai reiškia, kad ateityje galėčiau pridėti kažką panašaus:

 #ifdef CXX17 //if this is C++17 std::filesystem::something ...; #else std::experimental::filesystem::something ...; #endif 

Mano problemos:

1. Ar garantuojama, kad visi suderinami kompiliatoriai turi tas pačias eksperimentines funkcijas?

2. Ar eksperimentinės savybės yra linkusios į didelius pokyčius, dėl kurių jie nepatikimi?

Galbūt apie ką nors galvoti. Kodėl turėčiau juos naudoti? Man nepatinka naujas projektas ir nežinau, ką išspręsti.

77
10 апр. nustatė Kvantinė fizika 10 Bal 2017-04-10 11:41 '17 at 11:41 2017-04-10 11:41
@ 4 atsakymai
  • Ar garantuojama, kad visi suderinami kompiliatoriai turi tas pačias eksperimentines funkcijas?

Ne, eksperimentinės funkcijos yra neprivalomos.

  1. Ar eksperimentiniai požymiai yra linkę į didelius pokyčius, dėl kurių jie nepatikimi?

Taip, C ++ komitetas gali net nuspręsti atsisakyti funkcijos arba standartizacijos procese gali atsirasti defektas, dėl kurio funkcija pasikeistų.

Paprastai nesikliaukite eksperimentinėmis savybėmis. Eksperimentinės funkcijos yra būtent tai, ką sako žodis (t. Y. Eksperimentas).

76
10 апр. atsakymas pateikiamas 101010 10 balandžio. 2017-04-10 11:50 '17, 11:50, 10-10 val

Kažkas iš auditorijos uždavė klausimą „C ++ standartinės bibliotekos skydo“ metu 2016 m. „CppCon“ ( std :: eksperimentinis) būtų visiškai [...] kulka. [...] Kažkas panašaus į [...] antraštę <random> TR1, [tai buvo] tikrai, labai gražus TR1, ir jūs galėtumėte turėti visiškai neperšaunamą jo įgyvendinimą, tačiau paaiškėjo, kad sąsaja labai pasikeitė [prieš išleidimą] C ++ 11 ir [...], jei mes žinojome, ką dabar darome, pridedant experimental , tai būtų geresnis signalas žmonėms, kurie: "Ei, gal jūs nenorite naudoti std::experimental::variate_generator , nes ha-ha jis išnyks C ++ 11 ".

Atrodo, kad tarp standartinės bibliotekos kūrėjų ir komiteto narių yra noras, kad ateityje bent jau vardų erdvės std::experimental turinys turėtų būti iš tikrųjų „eksperimentinis“ ir neturėtų būti priimtas kaip kažkas std::experimental paverčia jį standartiniu C ++.

Ir ne, kiek aš suprantu, tai priklauso nuo standartinių bibliotekų teikėjų, ar jie įgyvendina įvairias funkcijas std::experimental .

48
10 апр. Joseph Thomson atsakymas, balandžio 10 d 2017-04-10 14:29 '17 at 14:29 pm 2017-04-10 14:29

„Eksperimentinis“ yra šiek tiek perdėtas terminas. filesystem biblioteka kilo iš „Boost“ ir prieš kelis kartus perėjo į ISO.

Tačiau ISO standartai yra sąmoningai labai konservatyvūs. Tai vadinasi eksperimentiniu, ISO aiškiai nežada, kad pavadinimas bus stabilus; aišku, kad ateityje turėsite dar kartą pasiekti savo kodą. Tačiau, žinant, kad ISO yra gidas.

Kalbant apie kompiliatorių suderinamumą, tikiuosi, kad jis bus pagrįstas. Tačiau bus kampinių atvejų (pvz., Santykiniai „Windows“ keliai), todėl būsimas standartas gali nutraukti esamą kodą. Idealiu atveju jūsų kodas bus sugadintas, jei ir tik tuo atveju, jei priklausote nuo šio kampinio atvejo, tačiau tai nėra garantija.

28
10 апр. Atsakymas, kurį pateikė MSalters 10 Bal 2017-04-10 11:49 '17 at 11:49 2017-04-10 11:49

Galbūt apie ką nors galvoti.

Keletas aplinkybių:

  • Kaip yra kelių platformų projektas? Jei dalyvauja tik vienas kompiliatorius, galite patikrinti jo įgyvendinimą ir įrašus. Arba paprašykite jų!

  • Kiek didelis yra jūsų kodo pagrindas? Kiek reikšmingas bus pokyčių poveikis?

  • Kokia yra jūsų projekto svarba yra API / bibliotekos / funkcijos funkcijos?

  • Kokios yra alternatyvos?

    • Naudokite eksperimentinę funkciją, tada pritaikykite kodą, kad pakeistumėte, kada / jei jis tampa standartizuotas. Tai gali būti taip paprasta, kaip pašalinant experimental:: arba tiek, kiek priverstinis sprendimas.
    • Pridėti abstrakcijos sluoksnį (Sergejo Balesto komentaras). Jei pasikeičia eksperimentinė funkcija, pakartotiniai įrašai bus atskirti. Standartinei funkcijai tai gali būti nereikalinga (std :: filesystem jau yra abstrakcijos lygis ...).
    • Naudokite kitą API / biblioteką. Tie patys klausimai: brandumas? Patikimumas? stabilumas? perkeliamumas? naudojimo paprastumas? funkcijos?
  • Std :: filesystem (arba tinklo TS) atveju, kaip alternatyva arba atsarginė kopija, yra padidinimo :: failų sistema (atitinkamai, padidinti :: dalyk), jei experimental neveikia arba dingsta.
8
11 апр. Atsakymą pateikė Pablo H 11 Bal. 2017-04-11 02:05 '17, 2:05, 2017-04-11 02:05