函子重载最佳实践
functor overloading best practices
你好,我正在努力学习函子。这是一个简单的例子
struct A {
double b,c;
A(const double bb, const double cc) : b(bb), c(cc) {}
double operator()(const double x, const double y) {
return b*c*x*y;
}
};
我想知道是否可以重载 A 以便它可以通过 b
、c
以及例如x
重用 operator()
中的代码。我的总体兴趣是不必在运算符中多次重写冗长的代码,并更好地理解这样做的最佳实践。
谢谢!
一种方法是在 <functional>
中使用 std::bind
。这个 returns 一个你可以不带参数调用的闭包。另一种方法是为 a
和 b
或派生的 class 创建一个具有默认参数的新构造函数,并将其重载为:
double operator()(const double x = m_x, const double y = m_y);
附带说明一下,请不要对成员函数的成员和参数使用相同的名称;这会产生歧义,如果您稍后重命名参数,甚至可能导致错误。
I would like to know if it is possible to overload A such that it could be passed b, c and also e.g. x reusing the code in the operator().
是的,做到这一点并不难。
double operator()(double x, double y) // Remove the const. It's useless.
{
// Call the other overload using the member data.
return (*this)(b, c, x, y);
}
double operator()(double bb, double cc, double x, double y)
{
// Not using any member data at all.
return bb*cc*x*y;
}
你好,我正在努力学习函子。这是一个简单的例子
struct A {
double b,c;
A(const double bb, const double cc) : b(bb), c(cc) {}
double operator()(const double x, const double y) {
return b*c*x*y;
}
};
我想知道是否可以重载 A 以便它可以通过 b
、c
以及例如x
重用 operator()
中的代码。我的总体兴趣是不必在运算符中多次重写冗长的代码,并更好地理解这样做的最佳实践。
谢谢!
一种方法是在 <functional>
中使用 std::bind
。这个 returns 一个你可以不带参数调用的闭包。另一种方法是为 a
和 b
或派生的 class 创建一个具有默认参数的新构造函数,并将其重载为:
double operator()(const double x = m_x, const double y = m_y);
附带说明一下,请不要对成员函数的成员和参数使用相同的名称;这会产生歧义,如果您稍后重命名参数,甚至可能导致错误。
I would like to know if it is possible to overload A such that it could be passed b, c and also e.g. x reusing the code in the operator().
是的,做到这一点并不难。
double operator()(double x, double y) // Remove the const. It's useless.
{
// Call the other overload using the member data.
return (*this)(b, c, x, y);
}
double operator()(double bb, double cc, double x, double y)
{
// Not using any member data at all.
return bb*cc*x*y;
}