5. Sort от Code Organization and Templates
Здравейте!
Имам нужда от помощ за задачката, тъй като не мога да захапя почти нищо от нея. Ще се опитам да структурирам въпроса си максимално точно и кратко, за да не губя времето ви:
1. printContainer<Set>(words.begin(), words.end()) - това е едната функция, която се подава в структурата на програмата (в maina). На пръв поглед изглежда елементарно - принтира се set, а като аргументи се подават началото и края му чрез итератори. Обърква ме какво е това <Set>. Ясно ми е, че трябва да се използва template, за да може функцията да приеме итератори за set <Song, string или int> без проблем... Но щом синтаксисът за викане на фунцкията е funcName <Set> (), значи има нещо специфично - само че в случая нямам нужда от специализация за темплейта, защото освен set, нищо друго не се принтира. С const template или как се прави това?
2. typedef std::set<Song, Reverse<Song, LessThan<Song>>> Set; - това първоначално като го видях, си казах оставям я тази задача, не е за мен :D Един колега я е решил и ми каза да прочета малко за C++ templates with functor... Разрових се в иинтернет, но да си призная от Basic C++ курса, до тук за пръв път срещам концепция, която не мога да разбера дори след 1 час дебъгване. Наистина не вдявам, защо трябва да overload-на оператора () (смисълът от functor), а после като се вика функцията не се използва (), a само <>... В общи линии направил съм един клас Reverse и забих - концепцията ми е ясна, имаме тип данни (int, string или custom), както и компаратор, но как да структурирам това, за да работи случая? Моля някой да ми даде някакви насоки - просто не мога да осмисля какво трябва да направя.
Благодаря предварително на всеки, който отдели време за казуса ми!
Привет,
Колегата, WasteOfRAM е дал добър отговор.
Концепцията за "C++ Functor", за който си прочел е точно това, което пише.
Обект, който се създаде, му се извиква оператора кръгли скоби. Т.е. можем да подаваме този обект като способ за някакво действие (в случая сравнение).
Подходът ми да ви карам да четете допълнително за последните задачи от домашното е точно такъв - а именно човек да придобие способността да мисли и намира допълнително информация.
Няма ден в професионалния ми опит, в който не ми се налага да се сблъсквам с непозната материя. Повярвай ми и при теб ще е така.
Да се върнем на структурата от данни std::set<> например.
Не можем да кажем std::set<Song>, защото трябва да сме дали на set::set-а способ за сравнение на 2 обекта от тип "Song".
Този способ може да е (говоря за кой и да е тип - не конкретно за "Song"):
> operator<(const T& left, const T& right) { //конкретна имплементация };
> външна функция, която да подадеш на контейнера, която да сравнява 2 обекта от типа на контейнера;
> lambda фунция (същото като горното, само че написана на място). Нещо като [](const T& left, const T& right) { //конкретна имплементация }
> Functor (или C++ структура или class, който в себе си да има предефиниран оператора кръгли скоби "bool operator()(const T& left, const T& right){ //конкретна имплементация }")
Поздрави