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;