提升库参数库

4

最近我在Boost库中发现了Parameters库。老实说,我不明白为什么它是Boost的一部分。当需要向函数传递多个参数时,可以将它们组成一个结构体,例如:

struct Parameters
{
    Parameters() : strParam("DEFAULT"), intParam(0) {}
    string strParam;
    int intParam;
};

void foo(const Parameters & params)
{
}

Parameters params;
params.intParam = 42;
foo(params);

这非常容易编写和理解。 现在举个使用 Boost Parameters 的例子:

BOOST_PARAMETER_NAME(param1) 
BOOST_PARAMETER_NAME(param2)

BOOST_PARAMETER_FUNCTION(
  (void),                // 1. parenthesized return type
  someCompexFunction,    // 2. name of the function template

  tag,                   // 3. namespace of tag types


  (optional              //    optional parameters, with defaults
    (param1,           *, 42)
    (param2,           *, std::string("default"))              )
  )
{
    std::cout << param1 << param2;
}

someCompexFunction(param1_=42);

我认为这很复杂,而且好处并不那么显著。

但现在我看到一些Boost库(Asio)使用这种技术。 在传递许多参数时,使用此库是否被视为最佳实践?

或者也许使用这个库有真正的好处,我没有看到? 您会建议在项目中使用这个库吗?


只有当您看到不想实现的功能时才需要。大多数应用程序只需要/希望非常简单的命令行开关。 - Tom Kerr
不,不,还是不。如果一个最佳实践会导致代码变得难以阅读,那么它就不是最佳实践了,任何可能的好处都不值得增加复杂性。Boost 的某些部分确实很棒,但对于超过 3 或 4 个参数的情况,我只会使用结构体。 - AJG85
@TomKerr 嗯,就我个人而言,我并没有看到很多我需要的好处或功能。但也许我的库的客户会非常欣赏它? - nogard
@nogard 我理解你的担忧。我曾经有一个案例,我从一个函数中移除了 Boost.Parameter 支持以提高编译时间,但实际上人们并不喜欢它,因为指定所有默认值变得相当麻烦。 - pmr
2个回答

2
你的技术需要创建很多临时变量(如果有足够的参数),在某些情况下会非常冗长。更棘手的事情是文档。如果你选择使用配置结构体,你将需要在两个地方解释你的参数。与此相比,文档Boost.Parameter函数更容易。
它还可以保持简洁,并允许我为整个函数族重复使用参数,而不是一遍遍地组合新的配置载体。
如果你不喜欢这个库,就不要使用它。它有几个其他你没有提到的缺点(包含量大、编译时间长)。
此外,为什么不同时提供使用 Boost.Parameters 和使用配置结构体的两种函数呢?两者都以共同的实现为分发. 管理头文件正确,"只付出你所用的"的承诺将得到保持。代价是可维护性。但是,如果用户不喜欢其中一个接口,你总可以将其弃用。

1

嗯,我不使用这个库,但关键是你可以通过名称传递参数。

想象一下,你有一个有很多参数的函数,在大多数情况下,你只想使用其中的几个。也许不总是相同的几个,所以把它们放在列表前面(这样其他参数就可以作为默认值提供)并没有帮助。这就是“命名参数”这种东西的用处:你只需给出要传递的参数的名称和值,任何顺序都可以,其他参数将被设置为默认值。你甚至不必知道所有可能的参数;函数的后续版本可以添加新的参数而不会破坏任何东西(只要为新参数选择的默认值模仿旧行为即可)。

与结构相比,你可以创建一个结构并使用默认值初始化所有内容。如果我没记错的话,这种东西内部工作方式基本上就是这样,通过传递一个参数对象并在将其传递到实际函数之前在那里设置值。


说真的,查看参数并以正确的形式提供它们有什么问题吗?我同意其中一条评论,即 Boost 中的某些内容确实很棒,但 boost::parameter 不是其中之一。该死,定制它的问题等等,实在是太大了,根本不切实际。 - There is nothing we can do

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接