Ahoj,
uplne presne jsem nepochopil jak ten dotaz myslis, takze se jeste zeptam:
1) Chtel jsi rict, ze parametr funkce
Filter.apply(X) muze byt ruzny? Jakoze to muze byt jak
struct Item, tak
std::string? Nejlepsi bude kdyz ukazes jak bys to chtel volat.
A pokud ad1) plati, pak:
a) Chces aplikovat vsechny
Rule na vstupni hodnotu?
- kazdy
Rule se podle typu vstupu muze chovat jinak? Nebo respektive muze mit jiny kod?
- nebo jen chces, aby
Rule umel prijmout ruzne typy, ale v podstate prace s nima je vzdy stejna. Ma stejny kod?
b) Chces aby se aplikoval na dany parametr jen ty
Rule tridy, ktere ho umi zpracovat? A ostatni ignorovat?
A jeste poznamka: omlouvam se, nechci byt uplne hnidopich, ale dve veci z toho kodu dost krici:
1) Potencialni bug. Ve svem kodu udelas toto:
filter_A.add(new RuleEqualTo(15));
a ve funkci
add() pak pridavas nove alokovany
Rule do vektoru, ktery pak korektne cistis ve svem destruktoru. Nicmene pokud nekde predtim, nez do vektoru pomoci
.push_back() ten pointer vlozis nastane vyjimka (treba v samotnem
.push_back()), tak se novy
Rule do toho
vector<Rule> neprida a timpadem se pri jeho destrukci nebude ani deletovat a timpadem mas leak, protoze ti zustane viset v pameti az do konce behu programu. Dneska uz se
operator new fakt neoplati skoro nikdy pouzivat. Kdyzuz pouzivas pointery, tak se koukni na smart pointers. V tomto pripade tedy
std::unique_ptr a
std::make_unique.
2) kdyz vracis bool hodnotu, tak tam staci podminka

tedy misto:
return item.id == id ? true : false;
staci napsat napriklad:
return item.id == id;