gpt4 book ai didi

c++ - 关于使用每个函数结构(参数对象)模拟 "named arguments"以获取函数调用选项的问题?

转载 作者:行者123 更新时间:2023-11-28 05:33:43 27 4
gpt4 key购买 nike

为了提高作为参数传递给函数的选项的代码可读性,我使用每个函数结构(参数对象)在函数调用时模拟“命名参数”。选项值,结构的成员,通常有默认值,所以在函数调用并非所有选项都需要指定。请参阅下面的示例代码进行说明。

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

  1. 这种方法(模式、成语)有名字吗?

  2. 有人可以确认这种方法是可移植的吗? (它与我使用的 gcc 和 clang 版本,但是否由标准?)

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

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

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

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

  7. [可选] 这种方法的潜在缺点之一是用户可能会忘记更改所有选项。您是否看到其他需要注意的缺点或注意事项?

示例代码

下面的示例基于我设置一个模拟器/模拟环境。

/// @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});
// ..
}

一些相关链接:

最佳答案

Can someone confirm it requires C++14 and not just C++11?

没有之一。它需要 C99/C11 指定的初始化器。它们不属于任何版本的 C++。

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

Do we expect a future C++1z or later to provide better approaches for named function parameters?

在可预见的 future ,您可能获得的最接近值是 this paper (PDF)。在 C++20 中实现标准化。这为指定初始化器提供了 C++ 支持,但即便如此,它也不会与 C99/11 的指定初始化器兼容。

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

关于c++ - 关于使用每个函数结构(参数对象)模拟 "named arguments"以获取函数调用选项的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38828710/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com