Al ordenar el código del proyecto, encontré que el paquete de un proyecto es muy interesante, y extraeré parte de la implementación para ilustrarlo.
Antecedentes: los diferentes tipos de datos estructurales en el proyecto tienen requisitos para agregar, eliminar, modificar y verificar, y los datos se almacenan en std::vector, así que considere usar plantillas de C++ y std::any para implementar la lógica comercial relacionada. reutilizar, agregar, eliminar, modificar y verificar códigos de lógica de negocios.
Esto implica una conversión de formato de datos, es decir, auto&& vec = std::any_cast<std::vector&>(anyVec);
Implementación
// 生成id的方法类classCIdGenerator{
CIdGenerator(){
boost::uuids::uuid uuid = boost::uuids::random_generator()();
m_id = boost::lexical_cast<string>(uuid);}const std::string&to_str(){
return m_id;}private:
std::string m_id;};classCBaseObjectManager{
public:CBaseObjectManager()=default;~CBaseObjectManager()=default;// dst为需要返回T类型的对象(唯一标识符为id)template<typenameT>int16_tGetObject(T& dst,const CIdGenerator& id, std::any anyVec){
int16_t ret =0;auto&& vec = std::any_cast<std::vector<T>&>(anyVec);auto it = std::find_if(vec.begin(), vec.end(),[id](const T& t){
return t.GetId()== id;});if(it != vec.end()){
dst =*it;}else
ret =-1;return ret;}// anyVec为需要修改的数据,是std::vector<T>数组template<typenameT>int16_tAddObject(const T& src, std::any&& anyVec){
int16_t ret =0;
ret = src.check();if(SuccessStatus != ret)return ret;auto&& vec =*(std::any_cast<std::vector<T>*>(anyVec));
T t;auto find =GetObject(t, src.GetId(), vec);if(find ==0)return-1;// 已存在
t = src;
t.SetId(CIdGenerator());
vec.push_back(t);return ret;}// anyVec为需要修改的数据,是std::vector<T>数组template<typenameT>int16_tUpdateObject(const T& src,const CIdGenerator& id, std::any&& anyVec){
int16_t ret =0;
ret = src.check();if(SuccessStatus != ret)return ret;auto&& vec =*(std::any_cast<std::vector<T>*>(anyVec));auto it = std::find_if(vec.begin(), vec.end(),[id](const T& t){
return t.GetId()== id;});if(it != vec.end()){
T src2 = src;auto& tmp =*it;
std::swap(tmp, src2);
tmp.SetId(id);}else
ret =-1;return ret;}// anyVec为需要修改的数据,是std::vector<T>数组template<typenameT>int16_tDeleteObject(const CIdGenerator& id, std::any&& anyVec){
int16_t ret =0;auto&& vec =*(std::any_cast<std::vector<T>*>(anyVec));auto it = std::find_if(vec.begin(), vec.end(),[id](T& t){
return t.GetId()== id;});if(it != vec.end())
vec.erase(it);elsereturn-1;return ret;}};