Notacja dla std :: function jest całkiem niezła w porównaniu ze wskaźnikami funkcji. Jednak poza tym nie mogę znaleźć przypadku użycia, w którym nie można go zastąpić wskaźnikami. Czy jest to po prostu cukier syntaktyczny dla wskaźników funkcji?Czy istnieje przypadek użycia dla funkcji std ::, która nie jest objęta wskaźnikami funkcji, czy jest to po prostu cukier syntaktyczny?
Odpowiedz
std::function<>
daje możliwość enkapsulacji każdy rodzaj obiektu na żądanie, czyli wskaźniki funkcyjne coś nie może zrobić (choć prawdą jest, że zakaz robienia lambdy można przekształcić funkcjonować wskaźniki).
Aby dać wyobrażenie o rodzaju elastyczność pozwala osiągnąć:
#include <functional>
#include <iostream>
#include <vector>
// A functor... (could even have state!)
struct X
{
void operator()() { std::cout << "Functor!" << std::endl; }
};
// A regular function...
void bar()
{
std::cout << "Function" << std::endl;
}
// A regular function with one argument that will be bound...
void foo(int x)
{
std::cout << "Bound Function " << x << "!" << std::endl;
}
int main()
{
// Heterogenous collection of callable objects
std::vector<std::function<void()>> functions;
// Fill in the container...
functions.push_back(X());
functions.push_back(bar);
functions.push_back(std::bind(foo, 42));
// And a add a lambda defined in-place as well...
functions.push_back([]() { std::cout << "Lambda!" << std::endl; });
// Now call them all!
for (auto& f : functions)
{
f(); // Same interface for all kinds of callable object...
}
}
jak zwykle zobaczyć live example here. Między innymi, pozwala to na realizację Command Pattern.
Wielkie dzięki, twój przykład ma wiele sensu. –
@static_rtti: OK, cieszę się, że to pomogło :) –
dlaczego jesteś tak niefrasobliwy co do regularnych funkcji? (to jedyny brakujący "!") :-P –
std::function
jest przeznaczony do reprezentowania dowolnego rodzaju obiektu do wywoływania. Istnieje wiele obiektów do wywoływania, których nie można w żaden sposób przedstawić za pomocą wskaźnika funkcji.
funktora:
struct foo { bool operator()(int x) { return x > 5; } }; bool (*f1)(int) = foo(); // Error std::function<bool(int)> f2 = foo(); // Okay
Nie można utworzyć instancję
foo
i przechowywać go w wskaźnikbool(*)(int)
funkcyjnego.lambda z lambda wychwytu:
bool (*f1)(int) = [&](int x) { return x > y; }; // Error std::function<bool(int)> f2 = [&](int x) { return x > y; }; // Okay
Jednakże lambda bez chwytania może być przekształcany do wskaźnika funkcji:
typ zamknięcia do lambda Wyrażenie bez przechwytywania lambda ma publiczną nie-wirtualną jawną funkcję konwersji stałej do wskaźnika do funkcji mającego ten sam parametr i typy zwracane, co operator wywołania funkcji typu zamknięcia. Wartość zwrócona przez tę funkcję konwersji jest adresem funkcji, która po wywołaniu ma taki sam skutek jak wywołanie operatora wywołania funkcji typu zamknięcia.
implementacji zdefiniowane wywoływalne wartości powrotu:
bool foo(int x, int y) { return x > y; }; bool (*f1)(int) = std::bind(&foo, std::placeholders::_1, 5); // Error (probably) std::function<bool(int)> f2 = std::bind(&foo, std::placeholders::_1, 5); // Okay
std::bind
jest wartość powrotna jest obiektem wywoływalnym implementacji zdefiniowane. Tylko jak ten obiekt może być używany, określa standard, a nie jego typ.
- 1. Zrozumienie Scali: ważna cecha czy cukier syntaktyczny?
- 2. Czy reguły przepisywania GHC rozpoznają cukier syntaktyczny?
- 3. Czy istnieje cukier syntaktyczny do wiązania wartości wewnątrz anonimowej funkcji w Scali?
- 4. Scala Mapa: tajemniczy cukier syntaktyczny?
- 5. Czy istnieje samodzielna implementacja funkcji std ::?
- 6. Czy "zsynchronizowany" naprawdę jest po prostu cukrem syntaktycznym?
- 7. Jaki jest ogólny przypadek funkcji promującej QuickCheck?
- 8. Czy istnieje sposób na wyjście z funkcji, która zwraca void?
- 9. Czy istnieje dobry przykład przypadków użycia dla funkcji angle.identity()?
- 10. Czy to możliwe, aby zrobić listę funkcji i powrócić do funkcji, która jest ich kompozytowy
- 11. Co to jest przypadek użycia `pip install -e`
- 12. Czy posiadanie funkcji za pośrednictwem deklaracji użycia jest legalne?
- 13. Czy istnieje sposób użycia dwóch instrukcji "..." w funkcji w R?
- 14. Haskell: złożenie funkcji jest po prostu uszkodzony mój mózg
- 15. Czy istnieje odpowiednik funkcji Python dla funkcji smooth.spline w R
- 16. Czy istnieje całkowita alternatywa dla funkcji `czytaj`?
- 17. Generic cukier syntaktyczny lub prawdziwa poprawa
- 18. Czy możesz ponownie zdefiniować klasę w ruby? czy jest to po prostu w IRB
- 19. Czy znalezienie równoważności dwóch funkcji jest nierozstrzygalne?
- 20. Czy istnieje rozszerzona biblioteka funkcji dla SQLite?
- 21. Czy można wykryć, czy obiekt jest tymczasowy z funkcji członka?
- 22. Czy ToString() jest dobry, zły, czy po prostu zbędny?
- 23. Czy jest to niezdefiniowane zachowanie std :: array?
- 24. Usuwanie cukier syntaktyczny: rozumienie listy w Haskell
- 25. Python: czy istnieje przypadek użycia do zmiany klasy instancji?
- 26. Czy dopuszczalne jest domyślne włączenie funkcji UnsafeHeaderParsing?
- 27. Czy "extern" C "` jest częścią typu funkcji?
- 28. Czy istnieje sposób na napisanie funkcji bash, która przerywa całą realizację, bez względu na to, jak jest wywoływana?
- 29. Jaki jest przypadek użycia dla określenia typu podstawowego w wyliczeniach?
- 30. Czy budowa obiektu funkcji statycznej zakresu jest bezpieczna dla wątków?
Jakikolwiek obiekt wywoływalny, który nie jest funkcją? Funkcjonalne funktory, lambdy, wyrażenia wiążące ...? –
std :: function to cukier syntaktyczny dla wszystkich typów funktorów, a nie tylko wskaźników funkcyjnych. – nurettin
@Xeo: odpowiedzi na to pytanie są znacznie lepsze. –