【问题标题】:class auto create functions based on member name类根据成员名称自动创建函数
【发布时间】:2019-06-27 13:27:54
【问题描述】:

我有一门课,我正在从记忆中阅读。

那有一堆链表。

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

我希望能够使用 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;
    }

    .........
}

【问题讨论】:

  • 你真的使用过这些功能吗?至少可以说,从模块句柄转换为 base*,以及在 DLL 中存储指针看起来很可疑。
  • 你想减少什么代码?您编写的代码或编译器发出的目标代码?

标签: c++ winapi


【解决方案1】:

这个怎么样?

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
}

【讨论】:

  • 这似乎可行,我认为没有宏会有更新的 c++11 方式
【解决方案2】:

如果我了解您通过模板尝试执行的操作,您希望在编译时根据类型选择成员变量。您不能真正做到这一点,但您可以改为使用信封类型,而不是为每个 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;

    ...
}

【讨论】:

    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2023-03-30
    • 2014-08-14
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    相关资源
    最近更新 更多