Funkční (C ++) - Functional (C++)
C ++ standardní knihovna |
---|
Kontejnery |
C standardní knihovna |
![]() | Tento článek může vyžadovat vyčištění setkat se s Wikipedií standardy kvality.Prosinec 2010) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
V kontextu programovacího jazyka C ++, funkční
označuje a hlavičkový soubor to je součást C ++ standardní knihovna a poskytuje sadu předdefinovaných šablony tříd pro funkční objekty, včetně operací pro aritmetiku, srovnání a logiku. Instance těchto šablon tříd jsou C ++ třídy které definují a operátor volání funkce a instance z těchto tříd lze nazvat, jako by byly funkce.[1] Je možné provádět velmi sofistikované operace bez psaní nového funkčního objektu, jednoduše kombinací předdefinovaných funkčních objektů a adaptérů funkčních objektů.
Šablona třídy std :: funkce
poskytuje C ++ 11 je univerzální polymorfní obálka funkce. Případy std :: funkce
může ukládat, kopírovat a vyvolávat jakýkoli volaný cíl - funkce, výrazy lambda (definující výrazy) anonymní funkce ), vázat výrazy (instance funkčních adaptérů, které transformují funkce na jiné menší funkce arity zadáním hodnot pro některé z argumentů) nebo jiné funkční objekty.
The algoritmy poskytované standardní knihovnou C ++ nevyžadují funkční objekty s více než dvěma argumenty. Funkční objekty, které se vracejí Booleovský hodnoty jsou důležitým zvláštním případem. A unární funkce jehož návratový typ je bool
se nazývá a predikáta binární funkce, jejíž návratový typ je bool
se nazývá a binární predikát.
Adaptabilní funkční objekty
Obecně má funkční objekt omezení typu jeho argumentu. Omezení typu nemusí být jednoduchá, i když: operátor()
může být přetížen nebo může být šablonou člena. Podobně nemusí existovat žádný způsob, jak by program mohl určit, co jsou tato omezení. Adaptabilní funkční objekt však určuje, jaké jsou argumenty a návratové typy, a poskytuje vnořené typedef
s takže tyto typy lze pojmenovat a použít v programech. Pokud typ F0
je model adaptabilního generátoru, pak musí definovat F0::typ_výsledku
. Podobně, pokud F1
je model adaptabilní unární funkce, musí definovat F1::typ_ argumentu
a F1::typ_výsledku
, a pokud F2
je model adaptabilní binární funkce, musí definovat F2::first_argument_type
, F2::second_argument_type
, a F2::typ_výsledku
. Standardní knihovna C ++ poskytuje základní třídy unary_function
a binární_funkce
zjednodušit definici adaptabilních unárních funkcí a adaptabilních binárních funkcí.
Adaptabilní funkční objekty jsou důležité, protože je mohou používat adaptéry funkčních objektů: funkční objekty, které transformují nebo manipulují s jinými funkčními objekty. Standardní knihovna C ++ poskytuje mnoho různých adaptérů funkčních objektů, včetně unary_negate
(který vrací logický doplněk hodnoty vrácené konkrétním adaptabilním predikátem) a unary_compose
a binary_compose
, které provádějí složení funkčního objektu.
Předdefinované funkční objekty
Standardní knihovna C ++ obsahuje v hlavičkový soubor funkční
mnoho různých předdefinovaných funkčních objektů, včetně aritmetických operací (Plus
, mínus
, znásobuje
, rozděluje
, modul
, a negovat
), srovnání (rovná
, nerovná se
, větší
, méně
, greater_equal
, a less_equal
) a logické operace (logický_a
, logický_nebo
, a logický_not
).[1]
Příklady
Obálky funkcí lze použít k volání běžných funkcí nebo funkcí objektů vytvořených výrazy lambda.
#zahrnout <iostream>#zahrnout <functional>/ * Definujte funkci šablony * /šablona <typename T>prázdnota PrintValue(T hodnota) { std::cout << hodnota << std::konec;}int hlavní(prázdnota) { / * Obálka funkce k funkci * / std::funkce<prázdnota(int)> func_a = PrintValue<int>; func_a(2015); / * Obálka funkce na ukazatel funkce * / std::funkce<prázdnota(int)> func_b = &PrintValue<int>; func_b(2016); / * Obálka funkce pro funkci lambda. * / std::funkce<prázdnota(int)> func_c = [](int hodnota) { std::cout << hodnota << std::konec; }; func_c(2017); / * Obálka funkce generovaná std :: bind (). * Při vazbě předejte předdefinovaný parametr. */ std::funkce<prázdnota(prázdnota)> func_d = std::svázat(PrintValue<std::tětiva>, „PI je“); func_d(); / * Obálka funkce generovaná std :: bind (). * Při volání funkce předejte parametr. */ std::funkce<prázdnota(plovák)> func_e = std::svázat(PrintValue<plovák>, std::zástupné symboly::_1); func_e(3.14159);}
Obálky funkcí lze také použít pro přístup k proměnným členů a členským funkcím tříd.
#zahrnout <iostream>#zahrnout <functional>šablona <typename T>třída CAnyData { veřejnost: CAnyData(T hodnota) : m_value{hodnota} {} prázdnota Tisk(prázdnota) { std::cout << m_value << std::konec; } prázdnota PrintAfterAdd(T hodnota) { std::cout << (m_value + hodnota) << std::konec; } T m_value;};int hlavní() { / * Obálka funkce do členské proměnné třídy * / CAnyData<int> data_a{2016}; std::funkce<int(CAnyData<int> &)> func_a = &CAnyData<int>::m_value; std::cout << func_a(data_a) << std::konec; / * Obálka funkce členské funkce bez předávání parametrů * / CAnyData<plovák> data_b{2016.1}; std::funkce<prázdnota(CAnyData<plovák> &)> func_b = &CAnyData<plovák>::Tisk; func_b(data_b); / * Obálka funkce členské funkce s předáním parametru * / std::funkce<prázdnota(CAnyData<plovák> &, plovák)> func_c = &CAnyData<plovák>::PrintAfterAdd; func_c(data_b, 0.1); / * Obálka funkce členské funkce generovaná std :: bind * / std::funkce<prázdnota(plovák)> func_d = std::svázat(&CAnyData<plovák>::PrintAfterAdd, &data_b, std::zástupné symboly::_1); func_d(0.2);}
Reference
- ^ A b Josuttis, Nicolai M. (1999). Standardní knihovna C ++. Addison-Wesley. ISBN 978-0-201-37926-6.