如何只传递几个默认参数?

时间:2017-12-24 18:25:43

标签: c++ parameter-passing

我创建了一个类似的函数:

void triangle(int n, int start=1, int spcs=0, char dec_y='n', char lf='#',char decf='o') {
    //some code
}

我想知道有没有办法可以像这样调用这个函数:

triangle(9, dec_y='y', lf='&');

不这样做:

void triangle2(int nn, char d_ec_y, char llf) {
    triangle(nn, 1, 0, d_ec_y, llf, 'o');
}
// then in main simply
triangle2(9, 'y', '&');

3 个答案:

答案 0 :(得分:4)

您无法更改参数的顺序。所以你不能直接做你想做的事。您有三种选择:

  • 你不想要的。
  • 您可以将参数作为结构传递。结构可以具有默认值。在调用函数之前,你只能改变你想要的那些。

例如:

struct params
{
    params(int n_)
     :n(n_)
    {
    }
    int start=1;
    int spcs=0; 
    char dec_y='n';
    char lf='#';
    char decf='o';
};

...
params p(0);
p.dec_y='y';
p.lf='&';
triangle(p);
  • 您可以使用boost::parameter来提供您想要的内容。查看this问题以获取示例用法。

答案 1 :(得分:0)

不,c ++要求所有使用默认参数的参数都在所有指定的参数之后。

在某些情况下,这可以通过多次重载来解决。但由于争论的模糊性并非总是可行的。这个想法是省略一些中间论点,如:

void foo(int, char const *, int =0);
void foo(int, int=0);

这对总是需要第一个int,但允许后跟一个字符串或另一个int,如果使用字符串版本仍然允许最后的int参数。

答案 2 :(得分:0)

使用一些高级元编程实际上可以使所有参数都是可选的,并以任何顺序提供它们而不声明任何重载。例如,这是在boost.process API

中实现的
namespace bp = ::boost::process;
bp::environment env{::boost::this_process::environment()};
bp::child ch0("cmd", env); // ok
bp::child ch1("cmd", env, bp::windows::hide); // fine too
bp::child ch2("cmd", bp::windows::hide, env); // still fine
bp::child ch3("cmd", bp::windows::hide); // no problem

这背后的想法是每个受支持的参数都包含在一个提供操作方法的特征类中,所有这些调用都调用相同的模板函数,该函数为每个提供的参数调用操作方法。