Как перегрузить >> оператор, чтобы получить список аргументов переменных через запятую - PullRequest
0 голосов
/ 18 октября 2018

- Быстро до

Так что, прежде чем кто-то скажет, что на этот вопрос ответили в другом посте, он не ... Это был домашний вопрос в другом посте, а на первоначальный вопрос никогда не отвечали, только сказалиони были не правы.

- Вопрос

Я пытаюсь перегрузить оператор >>, чтобы иметь возможность передавать n-число переменных, разделенных запятыми, в объект, подобный так ...

Mat M = (Mat_<double>(3,3) << 1, 0, 0, 0, 1, 0, 0, 0, 1);

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

Когда я перегружаю оператор << примерно так </p>

void operator<< (const double& is)
{
    std::cout << "hiya " << is << std::endl;
}

и попытаться использовать его следующим образом:

mat << 1.0, 2.0;

оператору передается только первое значение ... Второе значение никогда не используется, так как я считаю, что << имеет более высокий рейтинг, чем ,

Так что мой вопрос в том, что они делают в библиотеках, таких как eigen и openCV, чтобы иметь такую ​​функциональность.Я просмотрел их код, чтобы попытаться понять его, но, похоже, требуется более глубокое понимание того, как работает C ++, которого у меня нет, и я надеялся, что кто-то здесь сможет пролить на него свет.

Спасибо взаранее за любой совет.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы должны создать временный элемент из первого аргумента и заключить весь список запятых в круглые скобки:

myObj >> (some_temporary(3), 1, ...);

, что потребует, чтобы some_tevent было либо типом, либо функцией, возвращающей вспомогательную функцию, котораяперегружает оператор запятой, и ваш >> должен иметь возможность принимать этот тип.В противном случае приоритет >> будет «побеждать» и, следовательно, будет оценен до того, как будет замечено выражение запятой.

Более уродливой альтернативой будет ваш >> возврат типа, перегружающего оператор (), но я считаю, чтопервый предпочтителен (на самом деле, я бы сказал, что вся эта схема нежелательна).

0 голосов
/ 18 октября 2018

Вам придется перегрузить оператор вставки (<<) и оператор запятой (,), чтобы

mat << 1.0, 2.0;

было переведено как:

mat.operator<<(1.0).operator,(2.0);

или

operator,(operator<<(mat, 1.0), 2.0);

Вот демонстрационная программа, которая иллюстрирует идею, не делая ничего полезного.

struct Foo
{
};

Foo& operator<<(Foo& f, double)
{
  std::cout << "In operator<<(Foo& f, double)\n";
   return f;
}

Foo& operator,(Foo& f, double)
{
   std::cout << "In operator,(Foo& f, double)\n";
   return f;
}

int main()
{
   Foo f;
   f << 10, 20, 30;
}

и ее вывод

In operator<<(Foo& f, double)
In operator,(Foo& f, double)
In operator,(Foo& f, double)
...