也许我已经离开了左边的这个问题,但是可以通过构造函数定义一个成员函数吗?
就我而言,我正在尝试编写一个类来执行健壮的模型拟合(使用RANSAC)。我希望这可以推广到不同类型的模型。例如,我可以使用它来确定一组3D点的平面估计。或者,也许我可以确定两组点之间的转换。在这两个示例中,可能需要不同的错误函数和不同的拟合函数。静态函数调用可能看起来像
,而不是使用类model = estimate(data, &fittingFunc, &errorFunc);
我想知道我是否可以拥有这些模块化功能的成员实例?
像
这样的东西class Estimator
{
private:
// estimation params
double errorFunc(std::vector<dtype>, double threshold); // Leave this unimplemented
double fittingFunc(std::vector<dtype>, Parameters p); // Leave this unimplemented
public:
Estimator(void (*fittingFunc(std::vector<dtype>, Parameters), void (*errorFunc(std::vector<dtype>, double));
dtype estimate(data); // Estimates model of type dtype. Gets implemented
};
Estimator::Estimator(void (*fittingFunc(std::vector<dtype>, Parameters), void (*errorFunc(std::vector<dtype>, double))
{
fittingFunc = fittingFunc;
errorFunc = errorFunc;
}
我想我已经在我的例子中混淆了正确的语法,但我希望这个问题很明确。基本上我要问:构造函数可以接受函数指针作为参数并将它们分配为成员函数的实现吗?
其次,即使这是可能的,它是否被视为不良形式?
更新:如果它有帮助,here is MATLAB code for robust estimation具有这种可推广的结构,我希望在C ++中复制
答案 0 :(得分:4)
构造函数是否可以接受函数指针作为参数并将它们指定为成员函数的实现?
没有。不是成员功能。但你当然可以拥有公共成员函数指针:
class Estimator
{
public:
double (*errorFunc)(std::vector<dtype>, double threshold);
double (*fittingFunc)(std::vector<dtype>, Parameters p);
public:
Estimator(void (*fittingFunc(std::vector<dtype>, Parameters), void (*errorFunc(std::vector<dtype>, double))
: errorFunc(errorFunc)
, fittingFunc(fittingFunc)
{ }
dtype estimate(data);
};
对于一个更好(或更安全)的接口,你可以创建函数指针private
并拥有一个只调用它们的公共成员函数。
更一般地说,如果你没有开销,你可以拥有std::function<double(std::vector<dtype>, double)>
和std::function<double(std::vector<dtype>, Parameters)>
类型的成员,然后你可以使用更多种类的callables(函数指针,还有lambdas,绑定成员函数等。)
答案 1 :(得分:1)
是的,您可以为您的拟合和误差函数提供算法。你可以使用指向函数的指针来完成它。还有一个更好的解决方案,在标准头文件中你会发现模板std :: function,它可以用函数指针构建,也可以用函子或lambda表达式构建。
你的课将是这样的:
#include <functional>
class Estimator
{
private:
// estimation params
using error_func_type = std::function<double(std::vector<dtype>,double)>;
using fitting_func_type = std::function<double(std::vector<dtype>,Parameters p)>;
fitting_func_type fittingFunc;
error_func_type errorFunc;
public:
Estimator(fitting_funct_type fit, error_funct_type err)
:fittingFunc(fit),errorFunc(err){}
dtype estimate(data); // Estimates model of type dtype. Gets implemented
};