0

我想用 boost::optional 重载,但由于重载歧义而不能重载,我正在寻找一种解决方法。

例如,由于歧义,以下代码将无法编译:

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

我想做这个奇怪的事情的原因是,由于 boost::optional 的右值/左值问题引起的错误,我用函数重载替换了 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) { ... }

但这不会激发喜悦。有任何想法吗?

4

1 回答 1

1

正如评论中所述,您的常规案例有错字,可以进行递归调用。固定版本:

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);
于 2019-10-28T19:11:48.540 回答