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 без: —
Если есть автоматический способ, которым мне не нужно обновлять код DataHub<>::cleanUp() вручную было бы здорово.
Вот полная работоспособная демоверсия.
В реальных случаях Callback1, Callback2, db1_ а также db2_ иметь более полные и уникальные имена, и MyArray содержит более сложный класс (не int).
Это может быть преждевременной оптимизацией, чтобы избежать «виртуальной», но я хочу знать, возможно ли это.
От downvote, я думаю, что я недостаточно изучаю, и этот вопрос слишком прост.
Извините, я до сих пор не могу найти ответ.
Сделайте 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); }
};
Других решений пока нет …