Я думаю, что «Стратегический метод» полезен.В каждом ядре каждый фильтр помещается как объект в вектор, например:
std::vector<filter> filters;
затем
std::for_each(filters.begin(), filters.end(), [input&](f&){f.apply(input);});
====================
Итерируем по фильтру, а не по входу.Таким образом, мы можем добавить / del фильтр во время выполнения.
вроде:
class YourCore {
public:
void add_filter(const filter& f) {m_filters.add(f);}
// void del_filter(int index);
// void del_filter(by name or UID, so change vector to map or unordered_map);
private:
std::vector<filter> m_filters;
};