问题标签 [boost-parameter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
8227 浏览

c++ - C++“命名参数成语”与 Boost::Parameter 库

我查看了Named Parameter IdiomBoost::Parameter library。每个人都比另一个人有什么优势?是否有充分的理由总是选择一个而不是另一个,或者在某些情况下它们中的每一个都比另一个更好(如果是,在什么情况下)?

0 投票
1 回答
170 浏览

c++ - 将朋友与基类一起用于 Boost 参数

我正在使用Boost Parameter教程为扑克牌生成器创建命名参数构造函数。教程说要将 ArgumentPack 放入基类,但我想修改卡片生成器类中的变量。我想过这样做:

这是合法的还是有更好的方法来操作 CardGenerator 中的私有变量并使用 Boost Parameter 库?操作系统:Windows XP Pro,编译器:Visual C++ 2008 Express,Boost:1.39.0

0 投票
2 回答
418 浏览

c++ - 为什么 Boost Parameter 选择继承而不是组合?

我想这个网站上的大多数人都会同意可以通过两种方式外包实施:

  • 私有继承
  • 作品

继承权最常被滥用。值得注意的是,当另一种形式或继承可能更好时,通常使用公共继承,并且通常应该使用组合而不是私有继承。

当然,通常的警告适用,但我想不出任何时候我真的需要继承来解决实现问题。

然而,对于Boost Parameter 库,您会注意到他们选择继承而不是组合来实现命名参数习惯用法(对于构造函数)。

我只能想到经典的 EBO(空基优化)解释,因为这里没有我可以看到的虚拟方法。

有谁知道更好或可以将我重定向到讨论?

谢谢,马修。

0 投票
1 回答
236 浏览

c++ - 传递参数时如何将 boost::ref 与 Boost.Parameter 库一起使用?

我使用 Boost.Parameter 库为构造函数提供命名参数。

通常windowFunction会被boost::function对象复制,但是我也希望能够通过引用传递boost::ref.

但是,当我传递一个删除了的函数对象并且 ArgumentPack 包含对该值的引用boost::ref时。reference_wrapper<T>T

问题:有没有办法防止reference_wrapper<T>包装被移除?

例子:

将在构造函数中SomeFunctionObject& s传递给而不是。这样一来,就会被哪个抄袭,这是不可取的。mWindowFunClassAImplconst reference_wrapper<SomeFunctionObject>&sboost::function

0 投票
2 回答
5866 浏览

c++ - 使用强 typedef 作为 Boost Parameter 库的更轻量级替代方案?

我经常使用 Boost strong typedef 实用程序来提高我的程序的安全性。例如通过编写如下代码:

这里的强 typedef 提高了代码的可读性和安全性。(如果参数以错误的顺序提供,编译器将报告错误,如果参数都是 . 则不会出现这种情况int。)

我的问题是:

  • 可以为此目的使用 BOOST_STRONG_TYPEDEF 吗?(文档非常简短。)
  • 是否有重要的理由更喜欢 boost 参数库?
0 投票
1 回答
296 浏览

c++ - 为升压信号指定备用默认值2

Boost 的 signals2 库定义了一种很好的方式来传递一些扩展功能的备用参数(通过它的参数库)。当这些备用参数之一在我的代码中相当普遍时,我想制作一个帮助程序来进一步简化使用;例如,要指定备用互斥锁类型,我可以这样做:

不幸的是,这样做我也“失去”了为其他信号参数(例如组合器类型)指定替代值的能力,而没有回到冗长的语法或定义额外的元函数,例如 my_signal_with_combiner 或其他东西(这看起来很愚蠢) . 我不认为我可以使用默认模板参数值来做到这一点,因为 Combiner 的默认值需要拆分 Signature 才能获得返回类型。(当然,理想情况下,我想要适用于任何其他参数的东西,而不仅仅是组合器。)

所以,“真正的”问题是:是否有一种(简单的)方法来定义类似 signal_type 的东西,它的行为与其相同,但其中一个参数具有不同的默认值?(理想情况下,如果 Boost.Signals2 将来添加更多参数,则不需要更改。)

(另外,请不要使用 C++11。仍在使用较旧的编译器。)

0 投票
1 回答
765 浏览

c++ - Boost.Parameter:命名模板参数与 CRTP 结合

警告:前面需要冗长的介绍来解释问题。在 Vandevoorde 和 Josuttis 的 ch 16.1 中首次描述的命名模板参数习语可以使用Boost.Parameter库方便地编写

上面的代码允许通过命名它们和覆盖BreadSlicer任意顺序的可选模板参数。这使得使用许多默认参数进行基于策略的设计非常方便。Policy1_isPolicy2_is

为了避免基于策略的设计非常微妙的 ODR 违规(有关解释,请参阅 Alexandrescu 的这篇旧帖子),我希望能够在命名模板参数上应用 CRTP 模式:

但是,上面的 Boost.Parameter 实现无法编译,因为一些内部 static_assert 失败并显示类似 (VC10 SP1) 的消息

'main::CuriousBreadSlicer' :不允许将未定义的类作为编译器内在类型特征 '__is_base_of' 的参数

问题:这个静态检查可以关闭吗?通过宏或模板技巧?

至于可能的解决方法:

  1. 上面的代码在功能上等同于这个手写代码。对于该代码,CRTP 模式确实有效。然而,它需要大量的样板代码,Boost.Parameter 库可以方便地自动化。
  2. 我可以要求 CRTP 参数在模板参数列表中始终排在第一位,而不是将其包装在一个 Policy1_is类中。这解决了编译时错误,但它失去了覆盖的顺序独立性。

所以看起来我就是高尔夫球手所说的“在俱乐部之间”。哪种解决方案最好?

0 投票
0 回答
429 浏览

c++ - 使用 Boost 参数库进行谓词检查时出现问题

我对使用 Boost(实际上是 Boost Graph Library)相当陌生,并且正在尝试编写我的第一个图形算法。由于我的算法需要将几个可选和可默认参数传递给它,我想我会尝试使用 Boost::Parameter 库。据我了解,这是对在 BGL 中广泛使用的旧 BGL 命名参数系统的改进。

我一直在学习这里的教程。本教程中的第一个简单示例运行良好,但是当我尝试使用谓词要求检查我的参数是否与算法前置条件匹配时,我得到了很多难以理解的编译器错误。

以下测试代码是本教程中谓词检查示例的精简版本。

这些是来自编译器的错误消息:

t 用作模板参数 'T2' 的模板参数,预期一个真实类型错误 C2955:'boost::is_convertible':使用类模板需要模板参数列表错误 C2065:'_':未声明的标识符错误 C2955:'boost ::graph_traits':使用类模板需要模板参数列表错误 C2065:'_':未声明的标识符错误 C2955:'boost::graph_traits':使用类模板需要模板参数列表错误 C1903:无法从先前的错误中恢复( s); 停止编译 使用类模板需要模板参数列表错误 C2065:'_':未声明的标识符错误 C2955:'boost::graph_traits':使用类模板需要模板参数列表错误 C1903:无法从先前的错误中恢复;停止编译 使用类模板需要模板参数列表错误 C2065:'_':未声明的标识符错误 C2955:'boost::graph_traits':使用类模板需要模板参数列表错误 C1903:无法从先前的错误中恢复;停止编译

我认为问题与括号中的下划线有关: boost::graph_traits<_>::traversal_category

但是我真的不知道发生了什么,并且非常感谢有关如何纠正问题的任何建议。一些指向更多代码示例和用户文档的指针也将非常有帮助。参数库看起来很强大,我准备花一些时间学习如何有效地使用它。

我将 Boost 1.47 与 Microsoft Visual Studio 2010 一起使用。

0 投票
2 回答
1769 浏览

c++ - 升压参数库

最近我在 Boost 中找到了Parameters库。老实说,我不明白为什么这是 Boost 的一部分。当需要将多个参数传递给函数时,您可以从中创建一个结构,例如:

这很容易编写和理解。现在使用 Boost 参数的示例:

我认为这真的很复杂,而且好处不是那么显着..

但现在我看到一些 Boost 库 (Asio) 使用了这种技术。使用此库传递许多参数是否被认为是最佳实践?

或者也许使用这个库有我看不到的真正好处?你会推荐在项目中使用这个库吗?

0 投票
1 回答
371 浏览

c++ - 如何使用类似 boost.parameter 的语法获得更快的编译速度?

我目前正在使用带有一些工厂函数的 boost.parameter 并且编译时间变得令人望而却步。

目前我有一个像这样的常见模式:

wheremakeThing有 30 个参数,其中大多数带有默认值。我想保留“命名参数”语法以及按类型而不是位置匹配参数的能力。

如何在不更改工厂调用站点的语法的情况下获得更好的编译速度?

注意:从 boost.MPL 速度和说 brigand 速度之间的差异来看,在我看来,如果在 boost.parameter 等效项中使用现代元编程技术,编译时间至少应该有一个数量级的改进。

更新:这是我正在做什么的一个精简示例:在裸机嵌入式上下文中,我将不同的外围设备抽象为遵循基于策略的类设计习语的复杂模板类。每个类在编译时都需要大量配置信息,并且只使用所需的功能(不能依赖优化器去除未使用的东西,因为所有 SFR 交互都是可观察的,因此是易变的,因此是不允许的)。

这些基于策略的类对于用户配置来说非常难看,大多数嵌入式用户如果在公共界面中看到 < 就会尖叫,所以我使用 boost.parameter 来创建一个性感工厂,他们可以将所有类型编码的愿望传递给它(就像 hana 风格一样),我将类生成为本地静态,将其连接到所需的 ISR 并传回句柄。

大多数工厂有 10-25 个参数,预处理器时间似乎是杀手。无论用户是否实际调用该函数,每个工厂大约需要 1-5 秒。

更新 2:赏金已经结束,所以看起来没有解决方案。如果我有时间,我会写一个 boost.parameter 替换并在此处链接。使命名参数函数的返回类型取决于输入类型以更接近 boost.hana 样式语义也会很好。