14 kwietnia 2013

trailing return type

W nowym standardzie, został zaproponowany nowy sposób oznaczania zwracanego typu z metod/funkcji. Przydatne linki:
Najpierw konfrontacja starego i nowego stylu:
#include <iostream>

void a1(int) {
    std::cout << "call a1()" << std::endl;
}

auto a2(int) -> void {
    std::cout << "call a2()" << std::endl;
}

int main() {
    a1(1);
    a2(2);
    return 0;
}
Obie funkcje robią dokładnie to samo. Jak to zwykle bywa w C++ o mocy nowego mechanizmu można się przekonać, badając pewne szczególne przypadki tworzenia metod szablonowych. Dotychczas język nie potrafił poradzić sobie np. z detekcją typu, jaki ma powstać w wyniku dodania dwóch wartości typów pozyskanych z szablonu. W poniższym przykładzie add3(), korzysta z już nowych właściwości języka. Warto podkreślić, że słowo kluczowe auto, jest tutaj czymś zupełnie innym, niż automatyczną detekcją typu.
#include <iostream>

template<class Lhs, class Rhs>
Ret add1(const Lhs &l, const Rhs &r)
{
    return l + r;   // Error, Ret musi być typu l+r
}

template<class Lhs, class Rhs>
decltype(l+r) add2(const Lhs &l, const Rhs &r)
{
    return l + r;   // Error, niedozwolone w C++11
}

template<class Lhs, class Rhs>
auto add3(const Lhs &l, const Rhs &r) -> decltype(l+r)
{
    return l + r;
}

int main()
{
    std::cout << add3(3.14, 700L) << std::endl;
    return 0;
}
Wynik:
703.14

Brak komentarzy:

Prześlij komentarz