Неоднозначность перегрузки с boost :: опционально, обходной путь? - PullRequest
0 голосов
/ 28 октября 2019

Я хотел бы перегрузить с помощью boost :: option, но не могу из-за неоднозначности перегрузки, и я ищу обходной путь.

Например, следующий код не будет компилироваться из-за неоднозначности:

void foo() { ... }
void foo(const Class& A) { ... }
// \deprecated
void foo(boost::optional<const Class&> A) { A ? foo(A) : foo() }

Причина, по которой я хочу сделать эту странную вещь, заключается в том, что из-за ошибок, возникших из-за проблем rvalue / lvalue с boost :: option, вместо этого я заменяю экземпляры boost :: option перегрузками функций. Проблема в том, что происходят некоторые сбои API, поэтому мне нужно оставить устаревшие определения функций устаревшими.

Пример сбоев API с другими параметрами по умолчанию,

void foo(int a=0, boost::optional<Bar> A=boost::none, float b=0.0) { ... }

требует от меня переключенияпорядок аргументов:

void foo(int a=0, float b=0.0) { ... }
void foo(Bar A, int a=0, float b=0.0) { ... }

, но теперь прерванный случай - foo(1, boost::none, 3.14);, поэтому я хочу сохранить устаревшее определение функции только для этого типа вызова функции. Есть ли элегантный обходной путь?

Полагаю, одна (безобразная) возможность -

// \deprecated
void foo(int a, boost::optional<DummyClass> A, float b=0.0) { ... }

, но это не вызывает радости. Есть идеи?

1 Ответ

1 голос
/ 28 октября 2019

Как указано в комментарии, в вашем обычном случае есть опечатка, которая выполняет рекурсивный вызов. Исправленная версия:

void foo() { /*...*/ }
void foo(const Class& A) { /*...*/ }

[[deprecated]] void foo(boost::optional<const Class&> A) { A ? foo(*A) : foo(); }

Я заменяю boost::optional экземпляры вместо функций с перегрузками функций.

Поэтому вы можете заменить:

void foo(int a=0, boost::optional<Bar> A=boost::none, float b=0.0) { /*...*/ }

void foo(int a = 0) {/*..*/}
void foo(int a, Bar, float b = 0.0f) { /*..*/ }
void foo(int a, boost::none_t, float b = 0.0f) { /*..*/ }

[[deprecated]] void foo(int a, boost::optional<Bar>, float b = 0.0f);
...