我正在尝试使用指向四个运算符重载成员函数的指针std::vector
。这有什么问题:
struct Fractal
{ int dividee;
int divisor;
Fractal operator +(Fractal other)
{ [not important]
}
Fractal operator -(Fractal other)
{ [not important]
}
Fractal operator *(Fractal other)
{ [not important]
}
Fractal operator /(Fractal other)
{ [not important]
}
};
int main()
{ Fractal fractal = Fractal{3, 10};
typedef Fractal(*fractalOperator)(Fractal, Fractal);
std::vector<fractalOperator> ops =
{ &Fractal::operator +,
&Fractal::operator -,
&Fractal::operator *,
&Fractal::operator /
};
}
编译说
error: could not convert '{&Fractal::operator+, &Fractal::operator-, &Fractal::operator*, &Fractal::operator/}' from '<brace-enclosed initializer list>' to 'std::vector<Fractal (*)(Fractal, Fractal)>'
};
哪个不是很有帮助。什么是正确的方法?我正在使用c ++ 14。
答案 0 :(得分:2)
您的typedef
用于指向函数的指针,该指针需要两个Fractal
并返回Fractal
。你想要的是一个pointer to member function,它有不同的语法。
typedef Fractal(Fractal::*fractalOperator)(Fractal);
或者,使用using
别名,我觉得更容易阅读
using fractalOperator = Fractal(Fractal::*)(Fractal);
答案 1 :(得分:2)
一种方法是:
std::vector<std::function<Fractal(Fractal, Fractal)>> ops = {
[](Fractal l, Fractal r){ return l + r; },
[](Fractal l, Fractal r){ return l - r; },
[](Fractal l, Fractal r){ return l * r; },
[](Fractal l, Fractal r){ return l / r; },
};
这样做的好处是,运算符是作为成员函数还是自由函数实现无关紧要。
在封面下,lambda存储在具有正确调用签名的function
个对象中,并存储在vector
中。