我正在开发一个c ++类来包装对象及其成员函数。由于对象可能会更改,因此我在考虑是否可以使用某种机制来执行此操作,例如模板。这是一个例子:
class ObjectA
{
public:
void funcA1(double);
void funcA2(int, char);
private:
int value;
};
class ObjectB
{
public:
void funcB1(double);
void funcB2(int, char);
private:
int value;
float point;
};
现在我需要开发一个可以轻松包装ObjectA
或ObjectB
的类。可以确定ObjectA
和ObjectB
不继承任何父类,并且它们必须具有两个函数,函数的名称不相同,但是参数必须相同,就像funcA1
funcB1
和funcA2
funcB2
。
我认为以下代码应该有效。
template<typename T, typename funcAT, typename funcBT> // T: Object, funcAT: Object::funcA, funcBT: Object::funcB
class Wrapper
{
// ...
};
嗯,如果代码有效,是否有一些方法可以增加约束?例如,如何确保funcAT
必须属于T
,而不是其他功能?如何确保funcAT
只能有一个参数double
,而不是其他情况?
我的意思是:
ObjectA objA;
Wrapper<objA, objA::funcA1, objA::funcB1> wrapper; // no error
Wrapper<objA, other_funcA, other_funcB> wrapper; // ERROR
成员函数指针可以直接用作模板参数:
template<typename T, void (T::*f1)(double), void (T::* f2)(int, char)>
class Wrapper
{
// ...
};
Wrapper< ObjectA, &ObjectA::funcA1, &ObjectA::funcA2> w;