我怎样才能传递几个默认参数?

问题描述 投票:0回答:3

我创建了一个函数:

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', '&');
c++ parameter-passing
3个回答
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问题以获取样本用法。

0
投票

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

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

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

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


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

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

© www.soinside.com 2019 - 2024. All rights reserved.