有关使用per-function-struct(参数对象)来模拟“命名参数”以解决函数调用选项的问题?

时间:2016-08-08 12:02:18

标签: c++ c++11 c++14

为了提高作为参数传递给函数的选项的代码可读性,我使用per-function-struct(参数对象)来模拟函数调用中的“命名参数”。选项值,结构的成员,通常具有默认值,因此at 函数调用并不需要指定所有选项。请参阅下面的示例代码以进行说明。

我正在考虑将这种方法更广泛地用于函数调用,因为代码看起来非常紧凑,但在与初始化列表一起使用时仍然可读,而不提供参数对象的类型。另一个优点是调用函数的实现是直接/简单的。但是,我想知道:

  1. 这种方法(模式,成语)是否有名称?

  2. 有人可以证实这种方法是可移植的吗? (它汇编了 我使用的gcc-和clang-versions版本,但它是由它保证的 标)

  3. 有人可以确认它需要C ++ 14而不仅仅是C ++ 11吗?

  4. 我应该注意降低执行速度或 增加内存使用量?或者编译器能够 有效地优化这个?注意:在我目前的用例中,这些方面不是 因素,但我想知道他们是否可能成为避免这种情况的理由 一般方法。

  5. [可选]该方法的一个缺点是它需要我创建并命名一个额外的结构, 示例中为SetupOptions。如果我使用命名的约定 参数对象的类型为<function-name>Options我有时会得到 相当长的函数声明。有关如何工作的任何建议 在这附近?命名惯例?或者“命名参数”可以 在保持实施的同时以更好的方式模拟 相对简单?

  6. [可选]我们是否期望未来的C ++ 1z或更高版本提供更好的方法 对于命名函数参数? (我知道N4172但不是它的状态)

  7. [可选]这种方法的潜在缺点的一个例子是 用户可能忘记更改所有选项。 您是否看到其他缺点或警告要小心?

  8. 示例代码

    以下示例基于我设置a的实际用例 模拟器/模拟环境。

    /// @file Simulator.h
    /// Simulator for interaction with HW devices. Used e.g. by test cases.
    namespace Simulator {
    
    struct SetupOptions {
        bool faster_than_real_time = false;
        double time_step = 0.01; // [s]
    };
    
    void setup(SetupOptions options) {
        if (options.faster_than_real_time) {
            // ...
        }
        // ...
    }
    } // namespace Simulator
    
    /// ----------------------------------------------------------------------
    /// @file use_simulator.cpp
    
    void setup_simulator_for_application() {
        Simulator::setup({}); // (1) Uses default setup
        // ...
    }
    
    void setup_simulator_for_test_case() {
        // (2) Use named struct member for readability
        Simulator::setup({.faster_than_real_time = true});
        // ..
    }
    

    一些相关链接:

1 个答案:

答案 0 :(得分:1)

  

有人可以确认它需要C ++ 14而不仅仅是C ++ 11吗?

他们都不是。它需要C99 / C11指定的初始化器。哪个不是任何版本的C ++。

所以你写的不是标准的C ++。它基于编译器允许C ++中的C11代码。

  

我们是否期望未来的C ++ 1z或更高版本为命名函数参数提供更好的方法?

在可预见的未来,你可能获得的最接近的是像this paper (PDF)那样在C ++ 20中获得标准化。这为指定的初始值设定项提供了C ++支持,但即使这样,它也不会与C99 / 11的指定初始化程序兼容。

因此,如果继续使用这种混合C11 / C ++ 11语法,它可能会变得非法。