类根据成员名称自动创建函数

时间:2019-06-27 13:27:54

标签: c++ winapi

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

里面有一堆链表。

我试图通过某种方式通过模板自动制作函数来缩小代码。

我希望能够使用getFunction名称从其类功能名称中调用它

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;
    }

    .........
}

2 个答案:

答案 0 :(得分:0)

怎么样?

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
}

答案 1 :(得分:0)

如果我了解您要通过模板进行的操作,则希望在编译时根据类型选择一个成员变量。您实际上无法做到这一点,但是可以为每个SList使用信封类型而不是单独的成员变量。 See here

在您的情况下,它将类似于:

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;

    ...
}