Класс автоматического создания функций на основе имени члена - PullRequest
0 голосов
/ 27 июня 2019

У меня есть класс, который я читаю по памяти.

Имеет кучу связанных списков.

Я пытаюсь сделать мой код меньше, автоматизируя функции с помощью шаблонов.

Я хотел бы иметь возможность вызывать его из имени функции menber класса с именем 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 голосов
/ 28 июня 2019

Если я понимаю, что вы пытаетесь сделать с помощью шаблонов, вы хотите выбрать переменную-член во время компиляции на основе типа.Вы не можете этого сделать, но вместо этого вы можете использовать тип конверта вместо отдельных переменных-членов для каждого 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;

    ...
}
0 голосов
/ 27 июня 2019

Как насчет этого?

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...