类自动创建基于成员名称的功能

class auto create functions based on member name

本文关键字:成员 功能 创建 于成员      更新时间:2023-10-16

我有一个从内存读取的类。

有很多链接列表。

我试图通过以某种方式使用模板自动化函数来使我的代码变得更小。

我希望能够以getFunction name从其类Menber函数名称命名

namespace
{
    class base
    {
    public:
        class SList<class Random1Obj> Random1ObjList;
        class SList<class Random2Obj> Random2ObjList;
        class SList<class Random3Obj> Random3ObjList;
        class SList<class Random4Obj> Random4ObjList;
    };

    std::vector<class Random1Obj*> getRandom1ObjList()
    {
        std::vector<class Random1Obj*> vRet;
        base This = *(base*)((DWORD)GetModuleHandleA("random.dll"));
        for (SLNode<Random1Obj>* node = This.Random1ObjList.Head(); node; node = node->Next())
        {
            vRet.push_back(node->Data());
        }
        return vRet;
    }
    std::vector<class Random2Obj*> getRandom2ObjList()
    {
        std::vector<class Random2Obj*> vRet;
        base This = *(base*)((DWORD)GetModuleHandleA("random.dll"));
        for (SLNode<Random2Obj>* node = This.Random2ObjList.Head(); node; node = node->Next())
        {
            vRet.push_back(node->Data());
        }
        return vRet;
    }
    .........
}

怎么样?

namespace
{
    class base
    {
    public:
        class SList<class Random1Obj> Random1ObjList;
        class SList<class Random2Obj> Random2ObjList;
        class SList<class Random3Obj> Random3ObjList;
        class SList<class Random4Obj> Random4ObjList;
    };
    #define X(NAME, FUNNAME, DLL) std::vector<class NAME*> FUNNAME() 
    { 
        std::vector<class NAME*> vRet; 
        base This = *(base*)((DWORD)GetModuleHandleA(DLL)); 
        for (SLNode<NAME>* node = This.Random1ObjList.Head(); node; node = node->Next()) 
        { 
            vRet.push_back(node->Data()); 
        } 
        return vRet; 
    }
    X(Random1Obj, Random1ObjList, "random1.dll")
    X(Random2Obj, Random2ObjList, "random2.dll")
    X(Random3Obj, Random3ObjList, "random3.dll")
    X(Random4Obj, Random4ObjList, "random4.dll")
    #undef X
}

如果我了解您要通过模板尝试做什么,则要根据类型在编译时间选择成员变量。您不能真正这样做,但是可以使用一个信封类型,而不是为每个SLIST使用单独的成员变量。请参阅此处。

在您的情况下,这将是:

class base
{
public:
    struct Lists : 
        SList<Random1Obj>,
        SList<Random2Obj>,
        SList<Random3Obj>,
        SList<Random4Obj> {};
    Lists lists;
};
template<class T>
std::vector<T*> getRandomObjList()
{
    SList<T>& slist = This.lists;
    ...
}