尽管我担心你会告诉我这个话题已经被讨论过好几次了,但我还是敢问,因为我无法生成解决方案。也许我只是在寻找错误的东西......
假设我有一个从某些外部函数接收“模式”的函数。根据模式的不同,函数会调用同一对象的不同成员函数。对于没有任何参数的成员函数,这对我来说效果很好,但我没有找到如何将其扩展到带参数的成员。在现实世界的应用程序中,参数不是 int/float 而是更复杂的类,并且调用嵌套在不同的循环中,因此我需要多次放置 switch 语句,我认为这很难看。
问题A:是否可以在现有设计的基础上轻松添加对带参数成员函数的支持?如果是,如何做到这一点?如果可能的话,无需外部库...
问题 B:这是一个完全错误/糟糕的方法吗?我该如何做得更好?
非常感谢您的帮助和解释。
Chris
标题摘录:
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
是标准库提供的一个很好的函子。
但使用boost::bind
甚至std::bind
正如 Tomek 所建议的,在我看来确实很丑陋,并且在绑定多个参数时很快就会失去控制。
如果您有最新的编译器,则可以使用 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,但成员访问语法非常自然,并且很明显如何进行更改。
当然,如果您确实愿意,可以将参数设置为对象的引用,但我更喜欢这里的指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)