如何初始化函数指针的std :: vector到运算符重载?

时间:2018-05-07 15:03:43

标签: c++ operator-overloading c++14 member-function-pointers

我正在尝试使用指向四个运算符重载成员函数的指针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。

2 个答案:

答案 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中。