gpt4 book ai didi

c++ - 为库输入参数的正确方法

转载 作者:太空宇宙 更新时间:2023-11-04 11:26:42 28 4
gpt4 key购买 nike

我正在编写一个带有小型函数库的 Matrix 类。

该类能够实现急切求值和惰性求值。我希望用户选择类(class)是总是急于求成还是在可能的情况下是懒惰的。

问题:是否有提供此输入的标准方法?

我没有太多经验,所以我还没有真正了解标准库或 boost 或其他人是否(以及如何)这样做。可能使用的方式可能是:

  1. 拥有一个静态全局变量并为用户提供设置其值的方法。
  2. 检查预处理器指令,如果定义或未定义,则确定要编译的类的代码。
  3. 其他 ???

最佳答案

我假设这是一个只有标题的模板库。

如果您只想提供全局开关(而不是每个表达式选择),这似乎是宏开关的合理使用。我可能会将库设计成您的用户可以执行的操作

#define GREAT_LIBRARY_DISABLE_LAZY_EVALUATION
#include <great_library/matrix.hpp>

甚至

$ cxx -DGREAT_LIBRARY_DISABLE_LAZY_EVALUATION file.cpp

当然,您应该将更通用的选项设置为默认选项,如果用户未选择任何内容,则不会抛出错误。

但这只有在被定义或未定义的宏不会改变什么是你的库的类型和函数的有效使用以及什么不是的情况下才有用。如果您的用户发现他们最初的工作代码在定义宏后导致编译器错误页面,他们可能会感到不安。

因此,如果它不是“隐形”开关(即影响性能但不影响整个程序的语义),您最好在每个使用点提供细粒度控制。

也许您的模板采用可选参数。

great_lib::Computer<great_lib::EvaluationPolicy::Eager> eager_one;
great_lib::Computer<great_lib::EvaluationPolicy::Lazy> lazy_one;
auto some_result = eager_one.compute(arg1, ..., argN);
auto some_other_result = lazy_one.compute(arg1, ..., argN);

或者使用tag dispatching .

auto some_result = great_lib::compute(arg1, ..., argN, great_lib::eager_tag);
auto some_other_result = great_lib::compute(arg1, ..., argN, great_lib::lazy_tag);

最后,我不认为像

great_lib::set_evaluation(gerat_lib::EvaluationPolicy::Eager);
auto some_result = great_lib::compute(arg1, ..., argN);
great_lib::set_evaluation(gerat_lib::EvaluationPolicy::Lazy);
auto some_other_result = great_lib::compute(arg1, ..., argN);

在模板化的 C++ 库中非常有用。您真的希望您的编译器只生成用户选择的任何选项所需的代码,但如果这取决于运行时值,它将必须为两种变体生成代码(以及在运行时从中选择的条件) -时间)。更糟糕的是,您可能需要某种形式的运行时多态性,而我们通常会在高性能 C++ 代码中尽量避免这种情况。

关于c++ - 为库输入参数的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26412664/

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