Use plantillas de C++ y std::any para realizar la adición, eliminación, modificación y reutilización del código comercial de consulta

descripción general

  • 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的方法类
class CIdGenerator
{
    
    
	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;
};


class CBaseObjectManager
{
    
    
public:
    CBaseObjectManager() = default;
    ~CBaseObjectManager()= default;
	
	// dst为需要返回T类型的对象(唯一标识符为id)
    template<typename T>
    int16_t GetObject(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<typename T>
    int16_t AddObject(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<typename T>
    int16_t UpdateObject(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<typename T>
    int16_t DeleteObject(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);
        else
            return -1;

        return ret;
    }

};

Supongo que te gusta

Origin blog.csdn.net/stallion5632/article/details/125825522
Recomendado
Clasificación