在 C++ 应用程序中,使用哪种设计模式来配置不同基元类型的串联输出?

What design pattern to use for configurable output of a concatenation of different primitive types in a C++ application?

提问人:BernhardWebstudio 提问时间:6/5/2023 更新时间:6/5/2023 访问量:28

问:

假设您有一个 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(仅索引到数组中)

缺点:

  • 所有值均为双精度值

替代方案以及为什么它们与我的梦想不太匹配:

  • 对所有属性使用开关/大小写:长代码和重复代码,以及需要复制粘贴平均与“正常”输出
  • 将值抽象到它们自己的类中:感觉矫枉过正
  • 分成 和 : 可能是最接近我上面所做的,没有缺点,但对用户来说感觉像是不必要的开销ComputedIntValuesComputedDoubleValues

在 Python 程序中,它可以是一个简单的键进入 .在 C++ 中实现上述目标的最佳方法是什么?dict

C++ 设计模式 IO

评论

2赞 Öö Tiib 6/5/2023
C++ 是强类型编译时,因此限制很明确,编译器可以更好地优化。如果您希望运行时在 C++ 中的类型之间做出决定,那么您需要一个可以保存任何可能的替代项的类型,例如 std::variant<int、double>。从那里,您还将获得效率惩罚。

答: 暂无答案