提问人:BernhardWebstudio 提问时间:6/5/2023 更新时间:6/5/2023 访问量:28
在 C++ 应用程序中,使用哪种设计模式来配置不同基元类型的串联输出?
What design pattern to use for configurable output of a concatenation of different primitive types in a C++ application?
问:
假设您有一个 C++ 应用程序。此 C++ 应用程序在仿真运行期间计算各种物理属性。这些属性的类型可以是 int 或 double。
该程序/库的用户现在可以配置哪些属性应输出到哪个文件中。
我正在寻找的是一个解决方案,既可读又合理且具有性能。
在下文中,我勾勒出一个可能的解决方案,然后列出它的缺点:
enum ComputedValues {
STEP = 0,
TIMESTEP = 1,
TIME = 2,
VOLUME = 3,
PRESSURE = 4,
TEMPERATURE = 5 // there would be more, of course
};
const std::array<std::string, 6> ComputedValuesNames = {
"Step", "TimeStep", "Time", "Volume", "Pressure",
"Temperature"
};
struct OutputConfig {
std::vector<ComputedValues> values;
std::string file;
int outputEvery;
};
// then, the Simulator class would have methods
void addOutputConfig(OutputConfig conf);
void addAverageOutputConfig(OutputConfig conf);
// to configure what to output when
// finally, the actual simulation procedure would do something like:
std::array<double, 6> values = {
static_cast<double>(step + initialStep + 1),
dt,
initialTime + static_cast<double>(step + 1) * dt,
this->box.getVolume(),
pressure + kineticPressureTerm,
temperature;
for (OutputConfig conf : outputConfigurations) {
for (ComputedValues val : conf.values) {
outputBuffer += std::to_string(values[val]) + "\t";
}
}
// and similar for averaging these values.
优点:
- 读
- performant(仅索引到数组中)
缺点:
- 所有值均为双精度值
替代方案以及为什么它们与我的梦想不太匹配:
- 对所有属性使用开关/大小写:长代码和重复代码,以及需要复制粘贴平均与“正常”输出
- 将值抽象到它们自己的类中:感觉矫枉过正
- 分成 和 : 可能是最接近我上面所做的,没有缺点,但对用户来说感觉像是不必要的开销
ComputedIntValues
ComputedDoubleValues
在 Python 程序中,它可以是一个简单的键进入 .在 C++ 中实现上述目标的最佳方法是什么?dict
答: 暂无答案
评论