Как инициализировать std :: vector указателей на функции для перегрузок операторов? - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь сделать 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 голосов
/ 07 мая 2018

Один из способов сделать это:

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; },
};

Это имеет то преимущество, что не имеет значения, реализованы ли операторы как функции-члены или как свободные функции.

Под обложками лямбда хранится в function объектах с правильной подписью вызова, а те хранятся в vector.

0 голосов
/ 07 мая 2018

Ваш typedef предназначен для указателя на функцию, которая принимает два Fractal с и возвращает Fractal. Вам нужен указатель на функцию-член с другим синтаксисом.

typedef Fractal(Fractal::*fractalOperator)(Fractal);

Или, с псевдонимом using, который мне легче читать

using fractalOperator = Fractal(Fractal::*)(Fractal);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...