带有可选参数的c ++函数

时间:2017-01-24 16:32:59

标签: c++

声明这样的方法的最佳方法是什么:

calc( string name, string arguments, 
      string lib, 
      string &output, string &error, 
      string finishInfo )

其中每个参数都是可选的?如果需要,用户可以传递名称,参数和错误;只传递finishInfo或传递所有六个参数。可能是最友好的用户可以致电:

calc( "my name", , "my library", , , );

但我不知道是否有可能没有提升。我不能超载,因为我需要创建62种方法。我最好的想法是:

calc( string * name = NULL, string * arguments = NULL, 
      string * lib = NULL, 
      string * output = NULL, string * error = NULL, 
      string * finishInfo = NULL )

我正在将所有内容更改为指针,这样我们需要调用

calc( ptr_myName, NULL, ptr_myLib, NULL, NULL, NULL );

calc( string name = "", string arguments = "",
      string lib = "",
...
calc( "", "",
      "my library",

3 个答案:

答案 0 :(得分:4)

我对同一类型的许多论点的经验是,当我试图记住他们的顺序时,它很快变成令人沮丧和难以理解的混乱。其他语言(如Python)可以选择在将参数传递给函数时命名参数,但不幸的是我们在C ++中没有这样的快乐

一个很好的解决方法是参数struct。使用公共变量(或等效的getter / setter函数,但我通常没有发现这是必要的),最终用户可以在将结构传递给函数之前以清晰的方式设置所需的字段:

例如:

struct calc_args
{
   string name;
   string arguments;
   string finish_info;
   string output; // out arg
   string finishInfo; // out arg
};

void calc(calc_args& arguments)
{
   // ...
}

答案 1 :(得分:1)

我的建议是使用std::map<std::string, std::string>作为您的输入。

calc(std::map<std::string, std::string> const& args) { ... }

然后,你可以自由地传递任何东西。

您可以使用

calc({{"name", "my name"}, {"lib", "my library"}});
calc({{"lib", "my library"}});

答案 2 :(得分:0)

作为一个相关的兴趣点,可变参数模板可以在这里工作:

saveplot

这允许您将未知数量的参数传递给函数,并以递归方式对每个函数进行操作。