当函数有很多参数并且客户端代码只需要改变其中的一小部分时如何处理情况?

rsk*_*k82 2 c++ function named-parameters

那个案子怎么不迷路呢?例如,这是一个返回bool的函数,但需要10个参数:

bool myFunc(bool par1 = true, bool par2 = false, bool par3 = true,
  bool par4 = true /* and so on */ ) {}
Run Code Online (Sandbox Code Playgroud)

并且假设函数参数设置为90%的默认情况.但偶尔客户端代码只想改变其中的一小部分.我在这里看到的唯一选择是精心复制所有默认参数,直到我们找到需要更改的参数.有可能以这种方式调用此函数:

bool myVal = myFunc(par10 = true, par20 = false);
Run Code Online (Sandbox Code Playgroud)

因此,任何阅读代码的人都知道代码的内容(参数的名称很长但很有意义),而且当我更改函数定义时,无论何时调用它来更新默认参数,我都不需要查看?

Mat*_* M. 11

有一个中等名气的成语:命名参数成语.

这个想法很简单:

class Parameters {
public:
    Parameters(): _1(true), _2(false), _3(true), _4(true) {}

    bool get1() const { return _1; }
    bool get2() const { return _2; }
    bool get3() const { return _3; }
    bool get4() const { return _4; }

    Parameters& set1(bool t) { _1 = t; return *this; }
    Parameters& set2(bool t) { _2 = t; return *this; }
    Parameters& set3(bool t) { _3 = t; return *this; }
    Parameters& set4(bool t) { _4 = t; return *this; }

private:
    bool _1;
    bool _2;
    bool _3;
    bool _4;
};

bool myFunc(Parameters p);
Run Code Online (Sandbox Code Playgroud)

然后客户端可以这样做:

result = myFunc(Parameters());
Run Code Online (Sandbox Code Playgroud)

要么:

result = myFunc(Parameters().set4(false));
Run Code Online (Sandbox Code Playgroud)