我正在尝试创建一个指针访问类,其目标是简化对已知内存位置的访问。
至于现在我有这个课程:
template<class T = DWORD> struct Pointer
{
private://minimum 2 params
std::vector<T> params;
Pointer()
{}
Pointer(T a)
{params.push_back(a);}
public:
Pointer(T a, T b)
{params.push_back(a);Pointer::Pointer(b);}
Pointer(T a, T b, T c)
{params.push_back(a);Pointer::Pointer(b,c);}
Pointer(T a, T b, T c, T d)
{params.push_back(a);Pointer::Pointer(b,c,d);}
Pointer(T a, T b, T c, T d, T e)
{params.push_back(a);Pointer::Pointer(b,c,d,e);}
Pointer(T a, T b, T c, T d, T e, T f)
{params.push_back(a);Pointer::Pointer(b,c,d,e,f);}
Pointer(T a, T b, T c, T d, T e, T f, T g)
{params.push_back(a);Pointer::Pointer(b,c,d,e,f,g);}
//all the way to ... z
T* ResolvePointer(/*,bool fallback = false*/)
{
T variable = params[0];
try
{
auto it = params.begin();
++it;
for(; it != params.end(); ++it)
variable = *reinterpret_cast<T*>(variable) + *it;
}
catch(...)
{
/*if(fallback){
static char fallback_location[2048];
variable = reinterpret_cast<T>(&fallback_location[0]);
}else{*/
variable = NULL;
//}
}
return reinterpret_cast<T*>(variable);
}
T* operator()()
{
return ResolvePointer();
}
};
但无论何时我称之为
(例如:
Player[slot].Money = Pointer<int>(0x00400000+0x008E98EC,0xD8+(0x4*slot),0xE4,0x00,0x4)();
),
params
向量总是只有a
:(
P.S:我想使用可变参数模板,但我使用的是MICROSOFT VISUAL C++ 11
答案 0 :(得分:1)
构造函数中的Pointer::Pointer(...)
行不是构造函数委托,它是临时对象的声明。你基本上告诉编译器抛弃除参数a
之外的所有东西。您想要的语法 - VC11不支持 - 是:
Pointer(T a, T b, T c) : Pointer(a, b) {
params.push_back(c);
}
老实说,这个课程似乎很难想到。我想如果你问这个课程要达到什么目标而不是如何实现它,我们可以帮助你更多。
答案 1 :(得分:1)
从另一个构造函数调用构造函数实际上重构了整个对象,所以它不是“理智”。
从C ++ 11开始,可以完成同一对象的构造函数之间的委派,但它必须处于初始化列表级别
Pointer(T a, T b, T c) : Pointer(a, b)
{
params.push_back(c);
}
但是,为了定义一组函数,varadic模板可能有所帮助:
template<class T>
class Pointer
{
std::vector<T> params;
template<class A, class... AA>
void push(const A& a, const AA&... aa)
{ push(aa...); params.push_back(a); } //< invert these calls depending on the order you wish
void push() //the final recourse
{}
public:
template<class... AA>
Pointer(const AA&... aa)
{ push(aa...); }
};