
C++ functor vs funkcia
Som začiatočník v C++ takže som hľadal spôsob ako previesť reťazec na veľké písmená. Trochu ma zarazil fakt, že STL (konkrétne std::string resp. std::wstring) neobsahuje takúto základnú funkciu. Vygooglil som si henten functor convert1 (trošku som ho upravil pre svoje potreby). Ale zaujíma ma prečo autor zabalil preťažený operátor do štruktúry a urobil functor a nepoužil funkciu, keď obidve funguje rovnako (aspoň na prvý pohľad)? Viem si predstaviť prípady keď functor má zmysel, ale v tomto prípade ten zmysel nevidím. Je functor v niečom lepší? A ako je to s efektivitou sú obidve riešenia rovnako efektívne?
Na konci je ešte tretie riešenie, ktoré nepoužíva referenciu, ale návratovú hodnotu aké sú výhody / nevýhody jednotlivých riešení čo z toho je najefektívnejšie? A prečo sa vlastne v C++ preferujú referencie pred návratovými hodnotami?
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
// toto som si vygooglil
struct convert1 {
void operator()(wchar_t& c) { c = towupper((std::wint_t)c); }
};
// toto je moja funkcia ktorá funguje rovnako ako functor convert1
void convert2(wchar_t& c) { c = towupper((std::wint_t)c); }
void main()
{
wstring name1(L"Alex");
wstring name2(L"Barbora");
for_each(name1.begin(), name1.end(), convert1());
std::wcout << name1 << endl;
for_each(name2.begin(), name2.end(), convert2);
std::wcout << name2 << endl;
wstring name3(L"Andy");
// tretie riešenie
std::transform(name3.begin(), name3.end(), name3.begin(), towupper);
std::wcout << name3 << endl;
system("pause");
}
A ešte otázka na záver: načo autor príkladu explicitne pretypoval wchar_t na win_t? Keď sa to pretypuje aj imlicitne?