【问题标题】:Boost Parameters library升压参数库
【发布时间】:2012-08-17 21:14:37
【问题描述】:

最近我在 Boost.js 中找到了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 参数的示例:

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) 使用了这种技术。 使用此库传递许多参数是否被认为是最佳实践?

或者也许使用这个库有我看不到的真正好处? 你会推荐在项目中使用这个库吗?

【问题讨论】:

  • 仅当您看到不想实现的功能时。大多数应用程序只需要/想要非常简单的命令行开关。
  • 不,不,不。如果最佳实践使代码的可读性降低,这不是最佳实践,可能带来的任何好处都不值得复杂,boost的某些部分确实很棒,但我会只需将结构用于超过 3 或 4 个参数。
  • @TomKerr 好吧,就我个人而言,我没有看到我需要的太多好处或功能。但也许我图书馆的客户会很感激?
  • @nogard 我理解您的担忧。我曾经从函数中删除 Boost.Parameter 支持以增加编译时间,但人们实际上并不喜欢它,因为指定所有默认值变得非常讨厌。

标签: c++ boost parameters boost-parameter


【解决方案1】:

你的技术需要创建很多临时的(假设足够 参数)并且在某些情况下会相当冗长。一些东西 更棘手的是文档。如果你沿着 配置结构,您将有两个地方需要 解释你的参数。记录 Boost.Parameter 函数很容易 比较起来。

它还降低了冗长,并允许我重用参数 整个系列的功能,而不是组成一个新的配置 承运人一遍又一遍。

如果您不喜欢该库,请不要使用它。它还有其他几个 您没有提到的缺点(大量包含,高编译时间)。

另外,为什么不提供两全其美?一个使用 Boost.Parameters 的函数和另一个使用配置结构的函数,它们都在一个公共实现上调度。正确管理标题,“不为你不使用的东西付费”的承诺将被保留。价格是可维护性。但是,如果您的用户不喜欢某个界面,您可以随时弃用它。

【讨论】:

    【解决方案2】:

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

    假设您有一个带有很多参数的函数,而在大多数情况下您只想使用几个参数。也许并不总是相同的几个,所以把这些放在列表的前面(这样其他的可以作为默认值提供)将无济于事。这就是“命名参数”的用武之地:您只需按照您喜欢的任何顺序给出您想要传递的参数的名称和值,其他的将是默认的。您甚至不必知道所有可能的参数;该函数的更高版本可以添加新参数而不会破坏任何内容(前提是选择新参数的默认值以模仿旧行为)。

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

    【讨论】:

    • 说真的,检查什么是参数并以正确的形式提供它们有什么问题?我同意其中一个 cmets 的观点,即 boost 中的一些东西很棒,但 boost::parameter 不是其中之一。 Kurwa,定制它等的问题,远非实用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多