我有一个正在从内存中读取的类。
里面有一堆链表。
我试图通过某种方式通过模板自动制作函数来缩小代码。
我希望能够使用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;
}
.........
}
答案 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;
...
}