C成员函数指针有不同的参数 – 或者这是不是很糟糕?
作者:互联网
即使我担心你会告诉我这个主题已经被多次覆盖,我敢问它,因为我无法生成解决方案.可能我只是在寻找错误的东西……
假设我有一个从某个外部函数接收“模式”的函数.根据模式,该函数将调用同一对象的不同成员函数.对于我来说,这对于我没有任何参数的成员函数很有效,但我没有找到如何将它扩展到带参数的成员.在现实世界的应用程序中,参数不是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 :: function是标准库提供的一个很好的仿函数.
但是,正如Tomek所建议的那样,使用boost :: bind甚至std :: bind实际上是非常丑陋的IMO,并且在绑定多个参数时会迅速失控.
如果您有一个最近的编译器,您可以使用lambda,这使得Tomek的示例如下所示:
std::function<void(Object*)> f =
[](Object* const that){ that->memberFnNoArg(); };
int int_value = 22;
std::function<void(Object*)> f2 =
[int_value](Object* const that){ that->memberFnIntArg(int_value); };
Object o;
f(&o);
f2(&o);
设置lambda有几个字符,但成员访问语法非常自然,你做出更改的方式很明显.
当然,如果你真的想要,你可以让参数作为对象的引用,但我更喜欢这里的指针.
标签:argument-passing,c,function-pointers 来源: https://codeday.me/bug/20190831/1778834.html