【发布时间】:2013-05-30 14:35:53
【问题描述】:
虽然我害怕你会告诉我这个话题已经讨论过好几次了,但我还是敢问,因为我无法产生解决方案。可能我只是在寻找错误的东西......
假设我有一个从某个外部函数接收“模式”的函数。根据模式,函数将调用同一对象的不同成员函数。对于没有任何参数的成员函数,这对我来说效果很好,但我没有找到如何将它扩展到有参数的成员。在现实世界的应用程序中,参数不是 int/float 而是更复杂的类,并且调用嵌套在不同的循环中,所以我需要多次放置我认为丑陋的 switch 语句。
问题 A:是否可以在现有设计的基础上轻松添加对带有参数的成员函数的支持?如果是,如何做到这一点?如果可能没有外部库...
问题 B:这是一种完全错误/糟糕的方法吗?我怎样才能做得更好?
非常感谢您的帮助和解释。
克里斯
标题摘录:
typedef void (Object::*memberFunction)();
class Object
{
void memberFnNoArg();
void memberFnWithIntArg(int arg);
void memberFnWithFloatArg(float arg);
}
cpp 摘录:
void function()
{
int mode = getModeFromSomewhere();
int intArg = 33;
float floatArg = 66.6;
switch(mode)
{
case 1:
process(&Object::memberFnNoArg);
break;
case 2:
process(&Object::memberFnWithIntArg, ???); // how can I pass arg?
break;
case 3:
process(&Object::memberFnWithFlaotArg, ???); // how can I pass arg?
break;
default:
// do nothing;
}
}
void process(Object::memberFunction func)
{
Object object;
// loops, called several times, ...
(object.*func)(); // how do I handle different arguments?
}
【问题讨论】:
-
也许
std::bind能帮上忙? -
也许使用模板?
-
我不确定指向成员函数的指针如何简化您的设计。似乎将使用对象的算法变成函子可能是更好的方法。
-
@ben-voigt:这将简化我的设计,因为在 process() 内部,成员函数在算法内部的多个位置被调用。否则我将不得不将模式和其他参数传递给 process() 然后每次都进行区分。我正在寻找更透明的设计...
标签: c++ function-pointers argument-passing