boost::optional 过载歧义,解决方法?
Overload ambiguity with boost::optional, workaround?
我想用 boost::optional 超载,但由于超载歧义无法实现,我正在寻找解决方法。
例如,以下代码由于歧义将无法编译:
void foo() { ... }
void foo(const Class& A) { ... }
// \deprecated
void foo(boost::optional<const Class&> A) { A ? foo(A) : foo() }
我想做这件奇怪的事情的原因是,由于 boost::optional 的 rvalue/lvalue 问题引起的错误,我正在用函数重载替换 boost::optional 实例.问题是发生了一些 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) { ... }
但这并不能激发喜悦。有什么想法吗?
正如评论中所述,您的常规案例存在递归调用的拼写错误。固定版本:
void foo() { /*...*/ }
void foo(const Class& A) { /*...*/ }
[[deprecated]] void foo(boost::optional<const Class&> A) { A ? foo(*A) : foo(); }
I am replacing boost::optional
instances with function overloads instead.
所以你可以替换:
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);
我想用 boost::optional 超载,但由于超载歧义无法实现,我正在寻找解决方法。
例如,以下代码由于歧义将无法编译:
void foo() { ... }
void foo(const Class& A) { ... }
// \deprecated
void foo(boost::optional<const Class&> A) { A ? foo(A) : foo() }
我想做这件奇怪的事情的原因是,由于 boost::optional 的 rvalue/lvalue 问题引起的错误,我正在用函数重载替换 boost::optional 实例.问题是发生了一些 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) { ... }
但这并不能激发喜悦。有什么想法吗?
正如评论中所述,您的常规案例存在递归调用的拼写错误。固定版本:
void foo() { /*...*/ }
void foo(const Class& A) { /*...*/ }
[[deprecated]] void foo(boost::optional<const Class&> A) { A ? foo(*A) : foo(); }
I am replacing
boost::optional
instances with function overloads instead.
所以你可以替换:
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);