Jaki jest sens słowa kluczowego „auto”?

Jaki jest sens słowa kluczowego „auto”?

auto ma wiele zastosowań, jeśli chodzi zarówno o programowanie ogólne, jak i o zaoszczędzenie programiście pisania.

Rozważmy to na przykład. Czy wolałbyś napisać:

std::unique_ptr<name::long_type::goes_here> g = 
    std::make_unique<name::long_type::goes_here>(1,2,3,4)

lub:

auto g = std::make_unique<name::long_type::goes_here>(1,2,3,4)

Tak, oba są długie, ale znamy typ zwracany i ponowne określenie go jest nieco kłopotliwe do wpisania. Dotyczy to również iteratorów:

for(auto i = vec.begin(); ...)

kontra:

for(std::vector<type>::iterator i = vev.begin(); ...)

Jego zastosowanie w programowaniu generycznym polega również na ustaleniu typu zwracanego funkcji lub w przypadku wykonywania ogólnych algorytmów, w których nie znasz typu.

Rozważmy na przykład bardzo prosty przykład.

template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {
    return t + u;
}

Dzięki temu kompilator może określić typ operacji dodawania, a nie my sami próbujemy to rozgryźć. Zauważ, że w C++14 możesz pominąć końcowy typ zwracany. Na tym też nie kończą się jego zastosowania w programowaniu generycznym. Jeśli chcielibyśmy pracować z dowolnym typem kontenera jako funkcją opakowującą algorytmy, moglibyśmy użyć auto by nam w tym pomóc. Na przykład:

template<class Cont>
void my_sort(Cont&& cont) {
    using std::begin;
    auto first = begin(std::forward<Cont>(cont));
    // work with the iterators here
}

W przyszłości (C++14) auto może być używane do tworzenia polimorficznych lambd, a także takich jak:

[](auto a) { return a + 4; }

Co może być również przydatne.


Istnieje wiele zastosowań auto w C++

  1. Anonimowe obiekty funkcyjne, aka domknięcia, aka instancje lambda. auto to jedyny sposób ich przechowywania. Typy mogą być również generowane z tych typów, a typy na ich odwrocie, w nieskończoność.

  2. C++ może mieć dość złożone typy, takie jak typ niemutującego iteratora w nieuporządkowaną mapę, która używa niestandardowego alokatora i funkcji mieszającej. typedef może to złagodzić, ale typ m.begin() posiadanie określonej nazwy nie jest tak pouczające:foo_iterator it = jest tak samo znaczący jak auto foo_iterator = i auto jeden nie wymaga boilerplate’u gdzie indziej.

  3. Odliczenie typu zwrotu wykorzystuje auto słowo kluczowe, które jest wymagane do wykonania niektórych template funkcje działają bez ogromnej ilości standardowych cech. Wyeliminowanie schematu jest powszechnym tematem:solidny system typów C++ oznacza, że ​​typy mogą przenosić wiele informacji, a kodowanie ich przy każdym użyciu może przynieść efekt przeciwny do zamierzonego.

  4. W niektórych kaczkach wpisz template kod, praca nad wydedukowaniem typu zmiennej jest mniej więcej taka sama jak praca nad zakodowaniem wartości zmiennej i prawie identyczna w strukturze, czasami dosłownie:decltype(long expression) x = long expression; . auto eliminuje to powielanie.

  5. Wreszcie w C++1y wpisz lambdy dedukcji użyj auto powiedzieć, że argument jest wydedukowany. Rodzaj lekkiej wagi template . Porozmawiaj o rozszerzeniu tego na inne niż lambdy jest również w skunkworks.


Oto przykład z życia, w którym nie mogłem, nie używałem auto

Próbowałem zrobić instrukcję typu przełącznika w C++, gdzie typ zwracany jest specyficzny dla implementacji i nie można go łatwo zadeklarować. Tak więc użycie „auto” jest prawdopodobnie właściwym sposobem rozwiązania typu wyszukiwania deklaracji mapy.

auto foo = boost::bind(&VegaFactory::load_commodity_one_leg,this,conn,_1);
std::map<std::string,decltype(foo)> methods;
methods.insert(std::make_pair("FOO",commodityOneLeg));

auto f = methods.find(bar);
// Call f here