其他分享
首页 > 其他分享> > C成员函数指针有不同的参数 – 或者这是不是很糟糕?

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