是否可以将类的特定实例中的函数赋值为参数?多个类可以具有相同的签名。举个例子。谢谢!
UPDATE:上下文是,我们使用的是第三方库,它在设备完成进程后为我们提供回调。Ty清晰度是来自第三方库的签名。
UPDATE:在检查链接之后,解决方案似乎嵌入了特定的类。有没有更通用的方法?
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();
}发布于 2018-05-09 17:56:00
没有优雅的方式。成员函数必须带有this指针,而代码中的Processor类型胡枝子没有它。即使它有某种可以存储实例指针的void*,空闲函数和成员函数的调用约定也是不同的。它需要使用类似于std::invoke的东西来正确地处理它,这对于您的情况来说是不太可能的。
因此,如果您真的需要这样做,您可以将类实例分配给全局变量,并编写一个免费函数,该函数可以组合到使用全局变量调用成员函数的Processor签名中。话虽如此,但它是极其肮脏的。
例如,您可以这样做:
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++函子的库。如果不是,只有当您确信可以管理这个可怕的设计时,才使用此技术。
https://stackoverflow.com/questions/50255200
复制相似问题