2014-04-04 21 views
6

Herb Sutters wspomniał o ograniczonych szablonach (a.k.a. Concepts Lite) w rozmowie: Modern C++: What You Need to Know.Co to są ograniczone szablony?

Wiem, że doładowanie ma pakiet pojęć od wieków, który pozwala na ładnie drukować komunikaty o błędach, gdy mechanizm odliczania szablonów nie znajdzie operatorów, funkcji lub ma wzorce naruszenia dostępu.

Napotkano wzmianki na temat isocpp blog, że istnieje już eksperymentalna gałąź gcc implementująca document proposing Concepts Lite. Jednak patrząc przez obecny numer C++14 draft nie mogłem znaleźć żadnych wskazówek, czy będzie to już część C++14.

więc pytania są proste:

  • będą porozumiewać Lite być częścią C++ 14? (Odwołanie w preferowanym standardzie: nie mogłem go znaleźć i nie znam standardu.)
  • jaka jest prawidłowa składnia tego? (Propozycja i slajdy Herb diverge tutaj i nie wiem, który z nich jest bardziej aktualny)
  • można podać minimalny przykład ograniczenia (predykatu) i ograniczonego szablonu?

UWAGA: jeśli wystarczająco długo czekać Postaram się uzyskać gcc uruchomiony oddział i może przynajmniej powiedzieć nic na temat realizacji eksperymentalnej, co jednak nie oznacza poprawności składni.

+0

* Czy Concepts Lite będzie częścią C++ 14? (Odwołanie w standardowym preferowanym * Co? Nie ma jeszcze standardu C++ 14. W każdym razie nie, nie będzie w C++ 14. Spróbuję znaleźć jakieś odniesienie/dyskusję .. – dyp

+2

[Oferta] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3580.pdf) wyjaśnia to całkiem dobrze, nie dlatego, że czyni to pytanie nieuprawnionym, nie każdy chce przeczytać 30 stron. – David

+3

[Stroustrup mówi na swojej stronie głównej] (http://www.stroustrup.com/C++11FAQ.html#what-concepts), że skończy jako TR do C++ 14. Nie jestem pewien, w jaki sposób na dzień dzisiejszy ta informacja jest: – dyp

Odpowiedz

3

Concepts Lite to część "ograniczeń" pełnego projektu koncepcyjnego dla C++. Jest to opisane szczegółowo w N3701 "Concepts Lite". Rozdział 2 to krótki samouczek, który szybko przebiega przez podstawowe zasady i ich zastosowanie, co jest dobre dla osób, które nie chcą czytać wszystkich 56 stron.

Concepts Lite nie będzie częścią C++ 14, zostanie wydany jako osobna specyfikacja techniczna jeszcze w tym roku. Najnowsza wersja robocza dla tekstu TS to N3929 "Concepts Lite Specification".

Istnieje kilka różnych wariantów składni ograniczeń. Przykładowy kod, który Herb używany w Dyskusja:

auto mean(const Sequence& seq) { 
    auto n = 0.0; 
    for (auto x : seq) 
    n += x; 
    return n/seq.size(); 
} 

jest określany jako „składni lakonicznym”, ponieważ jest to krótszy odpowiednik składni opisowym:

template <typename __T> 
    requires Sequence<__T>() 
auto mean(const __T& seq) { 
    auto n = 0.0; 
    for (auto x : seq) 
    n += x; 
    return n/seq.size(); 
} 

Obaj wskazują, że szablon funkcja mean można tworzyć instancjami dowolnego typu, który modeluje koncepcję Sequence. Dla uproszczenia przyjmijmy, że wymagania dla Sequence są tylko tym, czego wymaga nasza implementacja mean: (a) członkowie begin & end, którzy zwracają iteratory, oraz (b) funkcja użytkownika size, która zwraca jakiś typ integralny. Możemy zdefiniować pojęcie jako:

template <typename T> 
concept bool Sequence() { 
    return requires(T t) { 
    {t.size()} -> Integral; 
    {t.begin()} -> InputIterator; 
    {t.end()} -> InputIterator; 
    requires Same<decltype(t.begin()), decltype(t.end())>(); 
    } 
} 

zakładając prosto do przodu definicje Integral, InputIterator i Same.Definicja ta koncepcja gwarantuje, że przez jakiś wymyślony wartości t typu T testowane:

  • t.size() jest prawidłowy wyraz, i zwraca typ, który modeluje koncepcja Integral.
  • t.begin() jest poprawna i zwraca typ, który modeluje InputIterator.
  • To samo dla t.end().
  • Numer InputIterator zwrócony przez t.begin() ma ten sam typ, który został zwrócony przez t.end().