注意:下面的代码示例不是真实的代码,真实的代码要复杂得多,在这里粘贴它,所以这个例子可能看起来很荒谬,但这并不重要。
struct Base
{
void beginEvent(int a)
{
impl(a, &Base::onBeginEvent, &Base::onBeginEvent);
}
void endEvent(int a)
{
impl(a, &Base::onEndEvent, &Base::onEndEvent);
}
void impl(int a, void (Base::*func1)(int), void (Base::*func2)(int, int))
{
//some complicated behavior
//...
(this->*func1)(a);
(this->*func2)(a, -a);
}
virtual void onBeginEvent(int a){}
virtual void onBeginEvent(int a, int negativeA){}
virtual void onEndEvent(int a){}
virtual void onEndEvent(int a, int negativeA){}
};
和
struct Derived : public Base
{
void onBeginEvent(int a) { std::cout << a << "\n"; }
void onEndEvent(int a, int b) { std::cout << a << "==(-(" << b << "))\n"; }
};
int main()
{
Derived d;
d.beginEvent(3);
d.endEvent(9);
return 0;
}
我的问题是:是否真的有必要impl
以它的方式定义函数void (Base::*func1)(int)
,void (Base::*func2)(int, int)
即使我知道它是一个成员函数指针(&Base::onBeginEvent
在这种情况下)?
当只提供其中一个时,我显然得到的响应太少了。打电话时有很多争论。我不想要可变参数函数或其他东西,我想要 Base 提供给 Derived 的有限数量的方法。Derived 可能只想调用一个或任何提供的方法的子集。但我知道,它们将只是同一个符号的重载。我的目标不是让它与一些疯狂的解决方法一起工作,我只是想知道,如果我可以减少发布的代码。
在我的真实代码中编辑 Thme impl 方法非常复杂,对于 begin 和 end 相同,只是在 impl 末尾使用不同的调用...