语言设计:默认方法参数继承

时间:2013-08-21 03:11:57

标签: c++

我认为,当一个函数(a)从另一个函数(b)中调用时,有一个常见的情况,而'a'有一些默认参数,需要'b'来支持它们。例如:

void a(int v1, int v2=0, int v3=1);
void b(int m1, int m2, int v1, int v2=0, int v3=1) {
    // ...
    a(v1, v2, v3);
    // ...
}

但这违反了DRY原则。当'a'的默认参数被更改但是在'b'中没有更改时,它可能会导致一个超级错误:

void a(int v1, int v2, int v3=0);
void b(int m1, int m2, int v1, int v2=0, int v3=1) {
    // ...
    a(v1, v2, v3);
    // ...
}

为什么C ++中没有机制来继承默认参数值?它可能看起来像:

void a(int v1, int v2=0, int v3=1);
void b(int m1, int m2, int v1, int v2=default(a::v2, 0), int v3=default(a::v3, 1)) {
    // ...
    a(v1, v2, v3);
    // ...
}

是否有语言,有这样的语法?

这可能是这个主板上的一个偏见?

2 个答案:

答案 0 :(得分:5)

问题实际上是魔术数字的使用。如果删除幻数,问题就会得到很好的解决。

enum DefaultA { DefaultA_v2 = 0, DefaultA_v3 = 1 };

void a(int v1, int v2=DefaultA_v2, int v3=DefaultA_v3);

void b(int m1, int m2, int v1, int v2=DefaultA_v2, int v3=DefaultA_v3) {
    // ...
    a(v1, v2, v3);
    // ...
}

答案 1 :(得分:0)

“但这违反了DRY原则。当'a'的默认参数发生变化,但在'b'中没有改变时,它可能会导致一个微妙的错误

坦率地说,如果你得到这个“bug”,我会说你的功能太紧密了。独立功能应该是独立的。如果更改一个函数的默认参数会导致另一个函数中断,我认为那里存在设计问题。