我试图从指向四个操作符重载成员函数的指针中生成一个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。
发布于 2018-05-07 17:49:07
您的typedef是指向函数的指针,它接受两个Fractals并返回一个Fractal。您需要的是一个指向成员函数的指针,它具有不同的语法。
typedef Fractal(Fractal::*fractalOperator)(Fractal);或者,使用using别名,我觉得它更容易读懂
using fractalOperator = Fractal(Fractal::*)(Fractal);发布于 2018-05-07 20:30:39
这样做的一种方法是:
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中。
https://stackoverflow.com/questions/50217236
复制相似问题