首页 > 解决方案 > 如何将函数指针的 std::vector 初始化为运算符重载?

问题描述

我正在尝试使用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。

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

解决方案


一种方法是:

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.


推荐阅读