Перегрузка оператора () для собственного класса векторов

У меня есть класс вектор CMyVektor

        class CMyVektor
{
private:
    int dimension = 0;
    std::vector<double> werte;
public:
    CMyVektor() {};
    CMyVektor(int dimension) : dimension{ dimension }
    {
        while (dimension-- > 0)
        {
            werte.push_back(0);
        }
    };
...

Очень хотелось бы перезагрузить оператор (), для того что бы была возможна запись, где вектору присваивается измерение и координаты

CMyVektor x;
x = (5.0, 7.3);

где x вектор, а то, что в скобках координаты. Количество измерений вектора не должно быть четко задано. То есть написать например два или три аргумента double вместо double [] не подходит. У меня есть такая версия кода, которая не работает.

CMyVektor& CMyVektor::operator()(double a[])
{
    int i = 0;
    std::cout << "d";
    while (a[i]) i++;
    this->dimension = i;
    while (a[--i])
    {
        std::cout << a[i];
        this->werte[i] = a[i];

    }
    return *this;

}

Буду очень признателен, если подскажете, что я делаю не так или возможно ли вообще перезагрузить оператор именно так.


Ответы (2 шт):

Автор решения: HolyBlackCat

Есть два разных оператора (...): скобки задающие приоритет операций, и скобки вызова функции. У вас первые, а перегружать можно только вторые.

В качестве альтернативы можно предложить x = {5.0, 7.3};. Чтобы это работало, сделайте своему классу конструктор с параметром std::initializer_list<double>. Пример:

#include <iostream>
#include <initializer_list>

struct A
{
    A() {}
    A(std::initializer_list<double> list)
    {
        for (double x : list)
            std::cout << x << '\n';
    }
};

int main()
{
    A a;
    a = {1,2,3};
}

Это также позволит конструировать ваш класс списком, вот так: A a = {1,2,3};. Мне кажется, что это хорошо, но если вы хотите разрешить только присваивание а не конструирование, замените конструктор на operator= с тем же параметром.

→ Ссылка
Автор решения: ТарасПрогер

Первый вариант - std::initializer_list<> который позволяет передавать в параметры множество значений и когда вызываете нужно писать фигурные скобки и там перечислять, что не сделаешь с массивами. В угловых скобках указываем тип. У него есть только три метода - begin(), end(), size()

#include <iostream>
#include <initializer_list>
using namespace std;

class CVektor
{
public:    
    CVektor(const std::initializer_list<double> list)
    {
        /*достаем все из инишиализер листа и запихиваем в массив*/
        double* m_data = new double[list.size()];
        int i = 0;
        for (auto& element : list)
        {
            m_data[i] = element;
            ++i;                   
        }

            /*
            работаем с m_data
            */
    }

    CVektor()
    {

    }

};
int main()
{
    CVektor c;
    c={ 2.0,2.0 };
    system("pause");
    return 0;
}

Но если Вы хотите именно через оператор круглые скобочки то вот -

    using arr = double[2];

    CVektor& operator()(arr const& loc)
    {
       // делаем что-то
    }
    // создание объекта где-то в мейн
     CVektor obj;
     obj({2.4, 4.0});
→ Ссылка