Предотвращение порядка кодирования: забудьте о вызове уникальной функции определенных полей (без v-table / std :: function)

MyArray<Callback> простая библиотека, которая отслеживает, существует ли целое число,
и позвонить Callback::call когда запрашивается удалить элемент:

template<class Callback> class MyArray {
bool database[10];
public: MyArray(){ for(int n=0;n<10;n++){database[n]=false;}}
public: void add(int t){database[t]=true; }
public: void cleanUp(int t){
if(database[t]){
Callback::call(t);  //#1
database[t]=false;
}
};
};

Пользователь вышеуказанной библиотеки должен определить Callback::call быть использованным в #1,
Вот примеры:

std::string testStr="";
class Callback1{
public: static void call(int t){
testStr+="call1 ";  //some unique operation - designed by User
}
};
class Callback2{
public: static void call(int t){
testStr+="call2 "; //some unique operation - designed by User

}
};

Далее пользователь должен создать собственный концентратор базы данных (DataHub), например : —

class DataHub{
MyArray<Callback1> db1_;
MyArray<Callback2> db2_;  //#2 Whenever I add a new field e.g. "db3_" ...
public:  MyArray<Callback1>* db1(){return &db1_;}
public:  MyArray<Callback2>* db2(){return &db2_;}
public:  void cleanUp(int t){
db1_.cleanUp(t);
db2_.cleanUp(t);      //#3 .... I tend to forget to add "db3_.cleanUp(t)" here
}
};

Вот пример DataHubИспользование: —

DataHub hub;
hub.db1()->add(5);
hub.db2()->add(5);
hub.cleanUp(5); //=> testStr = "call1 call2"

Вопрос

Как предотвратить ошибку кодера, чтобы забыть очистить некоторые поля (db1_,db2_,…) в #3 без: —

  • трюк, который имеет штраф V-таблицы или подобное
    например v-таблица / виртуальная функция / std :: function / function-pointer
  • взломать магию или подобное например макрос / X-макрос

Если есть автоматический способ, которым мне не нужно обновлять код DataHub<>::cleanUp() вручную было бы здорово.

Вот полная работоспособная демоверсия.
В реальных случаях Callback1, Callback2, db1_ а также db2_ иметь более полные и уникальные имена, и MyArray содержит более сложный класс (не int).

Это может быть преждевременной оптимизацией, чтобы избежать «виртуальной», но я хочу знать, возможно ли это.

От downvote, я думаю, что я недостаточно изучаю, и этот вопрос слишком прост.
Извините, я до сих пор не могу найти ответ.

-1

Решение

Сделайте DataHub библиотечным шаблоном, похожим по реализации на std :: tuple, который выполняет очистку.

Что-то вроде:

namespace detail {
void cleanUp(int i) {}

template<typename First, typename ... Rest>
void cleanUp(int i, MyArray<First> & first, MyArray<Rest>... & rest)
{
first.cleanUp(i);
cleanUp(i, rest...);
}
};

template<typename ... Callbacks>
class DataHub {
std::tuple<MyArray<Callbacks...>> dbs;
public:
template<std::size_t index>
auto get() { return std::get<index>(dbs); }
void cleanUp(int i) { std::apply(std::tuple_cat(std::make_tuple(i), dbs), detail::cleanUp); }
};
1

Другие решения

Других решений пока нет …