为了提高作为参数传递给函数的选项的代码可读性,我使用per-function-struct(参数对象)来模拟函数调用中的“命名参数”。选项值,结构的成员,通常具有默认值,因此at 函数调用并不需要指定所有选项。请参阅下面的示例代码以进行说明。
我正在考虑将这种方法更广泛地用于函数调用,因为代码看起来非常紧凑,但在与初始化列表一起使用时仍然可读,而不提供参数对象的类型。另一个优点是调用函数的实现是直接/简单的。但是,我想知道:
这种方法(模式,成语)是否有名称?
有人可以证实这种方法是可移植的吗? (它汇编了 我使用的gcc-和clang-versions版本,但它是由它保证的 标)
有人可以确认它需要C ++ 14而不仅仅是C ++ 11吗?
我应该注意降低执行速度或 增加内存使用量?或者编译器能够 有效地优化这个?注意:在我目前的用例中,这些方面不是 因素,但我想知道他们是否可能成为避免这种情况的理由 一般方法。
[可选]该方法的一个缺点是它需要我创建并命名一个额外的结构,
示例中为SetupOptions
。如果我使用命名的约定
参数对象的类型为<function-name>Options
我有时会得到
相当长的函数声明。有关如何工作的任何建议
在这附近?命名惯例?或者“命名参数”可以
在保持实施的同时以更好的方式模拟
相对简单?
[可选]我们是否期望未来的C ++ 1z或更高版本提供更好的方法 对于命名函数参数? (我知道N4172但不是它的状态)
[可选]这种方法的潜在缺点的一个例子是 用户可能忘记更改所有选项。 您是否看到其他缺点或警告要小心?
以下示例基于我设置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});
// ..
}
https://marcoarena.wordpress.com/2014/12/16/bring-named-parameters-in-modern-cpp/ - 在此SO问题中讨论的方法可能对应于链接中“命名参数成语”的子集。
N4172 - 关于命名参数的提案。
答案 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语法,它可能会变得非法。