wyrażenie lambda jako argument funkcji

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ć?

0

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

0

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

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ł...

0

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

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.

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.

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.

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

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