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); }
};
Других решений пока нет …