wyrażenie lambda jako argument funkcji

Odpowiedz Nowy wątek
2015-05-27 20:25
nieznajomy987
0
void count_sort (pesel *T, unsigned size, bool comp (const pesel &a, const pesel &b) noexcept) {

}

void radix_sort (pesel *T, unsigned size) {
    for (int i = size - 1; i >= 0; --i)
        count_sort(T, size, [i] (const pesel &a, const pesel &b) -> bool { return (a[i] < b[i]); }); // tutaj error
}
error: cannot convert ‘radix_sort(pesel*, unsigned int)::<lambda(const pesel&, const pesel&)>’ to ‘bool (*)(const pesel&, const pesel&)’ for argument ‘3’ to ‘void count_sort(pesel*, unsigned int, bool (*)(const pesel&, const pesel&))’
         count_sort(T, size, [i] (const pesel &a, const pesel &b) -> bool { return (a[i] < b[i]); });

Jak to poprawić?

Pozostało 580 znaków

2015-05-27 22:32
0

Pomijając wszystko - machniom szablon, żeby i funktory łykało.

Pozostało 580 znaków

2015-05-27 22:33
nieznajomy987
0

Ale to brzydkie, bo nie mamy kontroli nad tym, co użytkownik nam daje.

Pozostało 580 znaków

2015-05-28 15:26
0

std::function?


void count_sort (pesel *T, unsigned size, std::function<bool (const pesel &, const pesel &)> f){}

void radix_sort (pesel *T, unsigned size)
{
    for (int i = size - 1; i >= 0; --i)
        count_sort(T, size,
                   [i] (const pesel &a, const pesel &b) -> bool { return (a[i] < b[i]); }
        );
}

BTW. Nazywanie zmiennej T to chory pomysł...


edytowany 1x, ostatnio: yurai, 2015-05-28 15:29

Pozostało 580 znaków

2015-05-28 15:31
0

@nieznajomy Jeśli interfejs pasuje to co nas obchodzi co wciskają?

Pozostało 580 znaków

2015-05-28 15:32
1

Lambdę można użyć w miejsce wskaźnika na funkcję tylko jeśli lambda ma puste domknięcie, czyli [].
Jeśli musi być coś więcej, to std::function jest najprostsze w użyciu i działa zarówno z lambdami jak i wskaźnikami na funkcje.

Pozostało 580 znaków

2015-05-28 17:14
nieznajomy987
0

@Azarien: Tak - i tracimy na szybkości. Moim zdaniem używanie std::function to poroniony pomysł tak samo jak używanie std::array jak i std::vector do przechowywania tablicy, której końcowy rozmiar znamy. Niedługo będzie std::integer z tysiącem róznych niepotrzebnych ficzerów. Kto co lubi, ale ja jestem przeciwny.

@yurai: a jak mam nazwac? tablica_do_posortowania? tablica? array? Przyjmuje powszechną konwencję, że nazwy tablic zaczyna się z wielkiej litery, to załatwia sprawę i jak widzę T w miejscu, gdzie występuje tylko jedna tablica to nie zastanawiam się co to jest.

powszechną konwencję, że nazwy tablic zaczyna się z wielkiej litery - pierwszy raz słyszę o takiej konwencji. Mogę prosić o jakieś źródła? - twonek 2015-05-28 17:18

Pozostało 580 znaków

2015-05-28 17:29
0

Tak - i tracimy na szybkości.
Nie robiłem testów, ale podejrzewam że ta legendarna rzekoma powolność std::function jest w większości przypadków pomijalna.

jak używanie std::array jak i std::vector do przechowywania tablicy, której końcowy rozmiar znamy.

Akurat w przypadku std::array musisz znać rozmiar, i jest to po prostu szablonowe opakowanie na tablicę, w założeniach bez utraty wydajności. Strata na szybkości może być ewentualnie pod względem czasu kompilacji.

Odpowiadając na pytanie: nie, nie da się użyć lambdy o niepustym domknięciu żeby było i „ładnie” (bez szablonu) i „szybko”.
To po prostu nie jest „szybka” operacja (w sensie: tak szybka jak zwykły wskaźnik na funkcję, bo szybka to jest) i tego nie przeskoczysz.

Pozostało 580 znaków

2015-05-28 17:32
nieznajomy987
0

Może niejasno się wyraziłem
"jak używanie std::array jak i std::vector do przechowywania tablicy, której końcowy rozmiar znamy."
to dwie oddzielne rzeczy - bezsensowne jest używanie std::array (właśnie z tego powodu - to zwykła tablica z ficzerami, który prawie nikt nie używa, więc po co?) oraz bezsensowne jest używanie std::vector do przechowywania tablicy, której końcowy rozmiar znamy

Zaprzestań wypisywać bzdury i poucz się o tym, w jaki sposób działają współczesne kompilatory. - Endrju 2015-05-28 18:00
wyraziłeś się zupełnie jasno, ja się tylko z tobą nie zgadzam. - Azarien 2015-05-29 12:28

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0