首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将类的特定实例中的函数分配给变量,以保持状态。

将类的特定实例中的函数分配给变量,以保持状态。
EN

Stack Overflow用户
提问于 2018-05-09 13:55:15
回答 1查看 51关注 0票数 0

是否可以将类的特定实例中的函数赋值为参数?多个类可以具有相同的签名。举个例子。谢谢!

UPDATE:上下文是,我们使用的是第三方库,它在设备完成进程后为我们提供回调。Ty清晰度是来自第三方库的签名。

UPDATE:在检查链接之后,解决方案似乎嵌入了特定的类。有没有更通用的方法?

代码语言:javascript
复制
typedef double(*Processor) (
    double  first,
    double  second
);

double Adjustment = 0.5;
double Multiply(double first, double second)
{
    return first * second * Adjustment;
}

class Substract
{
public:
    double Adjustment;

    Substract(double adjustment) : Adjustment(adjustment) {}

    double Process(double first, double second)
    {
        return first - second - Adjustment;
    }
};

class Add
{
public:
    double Adjustment;

    Add(double adjustment) : Adjustment(adjustment) {}

    double Process(double first, double second)
    {
        return first + second + Adjustment;
    }
};

void Process(Processor processor)
{
    double result = processor(100, 50);
    std::cout << "Multiply=" << result << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    double result;

    Process(Multiply); // <-- success

    Substract* substract = new Substract(0.5);
    Process(substract->Process); // <-- not compiling
    delete substract;

    Add* add = new Add(0.5);
    Process(add->Process); // <-- not compiling
    delete add;

    getchar();

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-09 17:56:00

没有优雅的方式。成员函数必须带有this指针,而代码中的Processor类型胡枝子没有它。即使它有某种可以存储实例指针的void*,空闲函数和成员函数的调用约定也是不同的。它需要使用类似于std::invoke的东西来正确地处理它,这对于您的情况来说是不太可能的。

因此,如果您真的需要这样做,您可以将类实例分配给全局变量,并编写一个免费函数,该函数可以组合到使用全局变量调用成员函数的Processor签名中。话虽如此,但它是极其肮脏的

例如,您可以这样做:

代码语言:javascript
复制
typedef double(*Processor) (
    double  first,
    double  second
);

void Process(Processor processor)
{
    double result = processor(100, 50);
    std::cout << "Multiply=" << result << std::endl;
}

class Add
{
public:
    double Adjustment;

    Add(double adjustment) : Adjustment(adjustment) {}

    double Process(double first, double second)
    {
        return first + second + Adjustment;
    }
};

Add* g_add;

double add_f(double first, double second)
{
    return g_add->Process(first, second);
}

int _tmain(int argc, _TCHAR* argv[])
{
    g_add = new Add(0.5);
    Process(add_f);
    delete g_add; g_add = nullptr;

    getchar();
}

但是它导致了非常糟糕的软件设计。如果可能,将第三方库替换为支持C++函子的库。如果不是,只有当您确信可以管理这个可怕的设计时,才使用此技术。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50255200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档