问题标签 [boost-mpl]
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.
c++ - How to use boost::mpl to compose policies?
I have used something like the following to compose policies for my application:
The policy classes look like this:
To compose policies:
To use MyPolicy:
where they'd call:
and
Essentially, Cons constructs a type list here. It's pretty straight forward. However the typedef cons line is kinda ugly. It'll be ideal to have policy combiner that can do this:
Since we can have arbitrary number of policies, the CombinePolicy would need variadic template support in C++0x, which is only available experimentally in cutting edge compilers. However, it seems that boost:mpl library solved/worked around the problem by using a bunch preprocessing tricks. I guess I could use something like:
and then calls:
which would then use:
Obviously, I have a little trouble figuring out some_magic_lambda_expression here. I'm sure it's quite trivial for mpl experts here.
Thanks in advance.
c++ - 遍历 boost::mpl::list 的惯用方式是什么?
编辑:我已经编辑了示例以更好地类似于我遇到的问题,现在该函数取决于常规参数(而不仅仅是模板参数),这意味着无法在编译时进行计算。
我用手写类型列表写了一些代码,现在我们已经开始使用boost,我正试图将它移到mpl
库中。
我似乎找不到任何像样的文档,mpl::list
甚至无法将代码移植到boost::mpl
. 我有一种感觉,即使(如果?)我确实成功地移植了代码,它仍然不会是惯用的。能否请您告诉我应该如何编写以下boost
代码(请注意,这不是实际代码,这是人为的简化)。
原始代码 (codepad.org 粘贴)
尝试使用 Boost 失败 (codepad.org 粘贴)
c++ - 是否可以使用模板参数的所有组合生成类型?
我有一个模板类
以及typeU
和的一些库存类型实现:V
W
我想用模板参数的所有可能组合来测试类 S,
像这样:
唯一的问题是有 2 ** 5 ** 5 = 50 种组合,我不想一一输入。
有没有办法s_types
使用 Boost::mpl 或 Boost.Preprocessor 生成所有组合()?
谢谢。
添加了我最初的失败尝试:
我试图求助于索引(因此定义 u_types 等)和像这样的部分模板专业化
然后与
所有 S 类型都应生成和测试;
但是我未能通过确定来涵盖所有组合
1) 适当的
特化和 2) struct S_Wrapper 中的递归触发器
我所有的试验要么在运行时部分覆盖组合,要么在编译时推断失败。
有什么想法吗?
解决方案
受 Matthieu 的启发,我提出了一个模板类Combine
,这样我就可以用这样的两行代码来实现我的目标:
这将打印所有生成的类型。
代码
c++ - 使用 boost::mpl::bitor_
我有一个使用 boost::mpl 接受策略类列表的类。每个策略类都包含一个标识标签。我希望 MyClass 生成每个策略类的标识标签的 OR-ed 结果。不幸的是,我在弄清楚如何正确使用 boost::mpl::fold<> 功能时遇到了一些麻烦。如果有人可以提供帮助,我将不胜感激。
谢谢,保罗
c++ - 如何为类型列表中的每个继承类型调用非默认构造函数?
我正在使用 boost typelist 以下列方式实现策略模式。
该类Host
知道如何创建 的实例ExpensiveType
,这是一项代价高昂的操作,并且每个策略类都公开了使用它的功能。策略类将始终至少具有以下示例策略中定义的构造函数。
是否可以Host
以调用每个给定策略的构造函数的方式定义构造函数?如果不涉及类型列表,这很容易,因为每个策略的类型都是明确已知的。
boost::mpl::for_each算法看起来很有希望,但我不知道如何使用它来解决这个问题。
c++ - Sun C++ 编译器和 Boost
我目前正在 OpenSolaris 2009-06 上进行开发。Boost::MPL 文档似乎暗示不支持sun 编译器(该文档最后更新于 2004 年)。Boost 的顶级文档似乎表明支持 sun 编译器 5.10 及更高版本——我想这是一般级别的支持,还是包括 MPL?有没有人有关于 sun 5.10 编译器的 C++ 一致性状态的详细信息?
我总是可以使用 GCC 进行编译。
c++ - 如何将 boost::mpl::fold 与 boost::fusion::map 一起使用?
当我尝试编译这个时:
我收到以下错误:
来自 fusion 文档:“Fusion 提供与 MPL 的全面兼容性。Fusion 序列完全符合 MPL 序列,而 MPL 序列与 Fusion 完全兼容。如果您希望仅处理类型,则可以在 MPL 上使用 Fusion 序列。”
当我通过 boost::mpl::map 时,它可以工作。
有什么线索吗?
c++ - boost::mpl for_each 与普通的“C”数组
使用 boost::mpl,我可以创建一个三元素向量的 typedef,如下所示:
我可以使用以下代码段从这个 typedef 中提取值:
我想知道是否有办法做同样的事情,但使用普通的 'C' 数组而不是std::vector
. 不幸的是,我不能在这个项目中使用 STL 容器。
我怀疑我需要更换????与另一个绑定子句。有任何想法吗?
c++ - Boost.MPL 和类型列表生成
背景
这适用于游戏引擎中的内存管理器。我已经freelist
实现了,如果有这些,我希望有一个编译时列表。(例如 MPL 或 Fusion 向量)。'freelist
对应于分配大小,当分配/释放大小小于常量的对象时,它们将转到相应的freelist
.
最后,这意味着全局的小对象具有摊销的恒定时间分配和恒定时间释放。(耶。)
问题
问题是生成我需要的类型,所以我最终可能会使用 Fusion 来实例化这些类型。使用的类型有(缩短等):
's将freelist
管理data_block
's 的 2 次幂大小,从最小值开始到最大值。所以我想要的是:
要生成这个:
显然,我可以手动完成,但我宁愿避免这样做,以获得更通用和可调整的界面。在代码中使用 Fusion 向量也应该比硬编码成员更简单。
问题
我不确定解决这个问题的最佳方法;我以前从未广泛使用过 MPL。有任何想法吗?我有一些糟糕的想法,比如制定一个范围,然后remove_if
它不是 2 的幂等,但肯定不是最好的。也许是递归的,每次加倍,推入我的结果向量?我不知道该怎么做。
c++ - 如何为数据类型分类专门化模板类?
我们使用 boost - 所以使用那个库应该没问题。
但是我从来没有设法创建一组模板来为您提供针对整个数据类型的正确专业化,而不是专门针对单个数据类型(我知道该怎么做)。
让我举个例子来尝试将其变为现实。我想要一组可以用作的类:
其中 T 可以是简单的基本类型、PODS 或数组。它不能是一个类,因为一个类应该有自己的构造函数,而覆盖它的原始内存是一个糟糕的主意。
初始化应该基本上是 memset(&t, 0, sizeof(t)); 在处理遗留结构时,它可以更轻松地确保运行时代码与调试代码没有区别。
在 SDT = 简单数据类型的地方初始化,应该简单地创建一个包装底层 SDT 并使用编译器 t() 为该类型生成编译器定义的默认构造函数的结构(它也可能相当于一个 memset,尽管它看起来更优雅简单地导致 t()。
这是一个尝试,对 POD 使用 Initialized<>,对 SDT 使用 Initialized<>:
对于 SDT:
我专门为 T* 进行了初始化,以提供自然的指针行为。而且我有一个用于数组的 InitializedArray<>,它将元素类型和数组大小作为模板参数。但同样,我必须使用模板名称来区分——我对 MPL 的理解不够好,无法提供一个模板,该模板在编译时导致正确的专业化,所有这些都来自一个名称(理想情况下是初始化<>)。
我也希望能够提供重载 Initialized<typename T, T init_value> ,以便对于非标量值,用户可以定义默认初始化值(或 memset 值)
我很抱歉问了一些可能需要一些努力才能回答的问题。这似乎是我自己在阅读 MPL 时无法克服的障碍,但也许在您的帮助下,我可能能够确定此功能!
根据下面本叔叔的回答,我尝试了以下方法:
然后尝试了几个使用测试。
这会导致错误: *binary '=' : no operator found 采用'InitializedImpl '类型的右手操作数(或没有可接受的转换)
而如果我直接实例化正确的基类型(而不是派生类型):
现在我可以将 i 用作任何旧的 int。这就是我想要的!
如果我尝试对结构做同样的事情,就会出现完全相同的问题:
所以,正如你所看到的,我需要一些方法来告诉编译器将 Initialized 提升为像真正的 T 一样。
如果 C++ 让我从基本类型继承,我可以使用继承技术,一切都会好起来的。
或者,如果我有办法告诉编译器将父项中的所有方法外推到子项,以便对父项有效的任何内容对子项有效,我会没事的。
或者,如果我可以使用 MPL 或 type-traits 来 typedef 而不是继承我需要的东西,那么就不会有子类,也不会有传播问题。
想法?!...