Wpis z mikrobloga

Witajcie ceplusplusowe świry ( ) Dzisiaj w serii #zloteradypassera będzie o tzw. "zniechęcających przeciążeniach funkcji."

Jak zapewne wiecie jedną z nowości w C++ w stosunku do C jest mechanizm przeciążania funkcji. Możemy dzięki temu zdefiniowiać wiele funkcji o tej samej nazwie tak długo jak różnią się one parametrami.
Kompilator wybierze odpowiednią wersje na podstawie argumentów które do funkcji przekażemy.

Zgodnie z zasadą ODR każdy symbol powinien występować tylko raz, zarówno w jednostce translacji jak i wynikowym programie. Przeciążanie funkcji pozornie łamie te zasade bo przecież mamy wtedy wiele funkcji o tej samem nazwie. Rozwiazaniem jest "name mangling", kompilator wewnętrznie generuje dla każdej funkcji unikatowy identyfikator na podstawie nazwy funkcji oraz parametrów które one przyjmuje. W efekcie nazwa funkcji nie musi być unikalna, wystarczy że unikalna jest kombinacja "nazwa funkcji" x " parametry funkcji".

Dość tego przydługiego wstępu, przejdźmy do głównego tematu czyli zniechęcających przeciążeń funkcji. Jak każdy wie jeśli zdefiniujemy dwa przeciążenia dla f:

f(int var)
f(double var)
to pierwsze przeciężanie preferuje wyrażenia typu int, drugie typu double. Zatem wywowałanie f(6) rezultuje wywołaniem pierwszego przeciążenia a f(5.0) drugiego. Nie ma tu żadnej niespodzianki.
Zapis f(int var) oznacza że funkcja preferuje wyrażenia typu int i zostanie dla nich wywołana.

A co jeśli chcemy by dane wersja funkcja nie tyle preferowała pewien typ co była "znięchecona" do jednego konkretnego typu i wybierała wszystkie inne? W sukurs przyjdzie nam operator znięchecania - &&. Wystarczy w liście parametrów dodać po typie "&&" i przeciążenia funkcji będzie wtedy zniechęcone do przyjmowania argumentów danego typu.
Dla przykłądu by zniechęcic do int możemy napisać f(int&& var).

W przykładowym kodzie zdefiniowałem dwie funkcje, f1 i f2. Funkcja f1 wykorzystuje domyślny mechanizm preferowania typów, funkcja f2 korzysta z operatora znięchecania "&&" przez co funkcje zostaną wykonane niejako na odwrót.

Mam nadzieje że podobała wam się ta rada, dajce znać w komentarzach ile argumentów dzisiaj zniechęciliście (ʘʘ)

#programowanie #cpp #cplusplus
Pobierz
źródło: comment_1662097888RaiNnQfrLXVLhu8uSMkxnP.jpg
  • 4