Я хотел бы перегрузить с помощью 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) { ... }
, но это не вызывает радости. Есть идеи?