问题标签 [boost-preprocessor]
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++ - 基于Boost foreach实现enumerate_foreach
作为这个问题的序言:我一直在一个更大的工具包中实现各种 C++ 实用函数和(当我必须)宏供我自己使用。最近我一直在制作各种基于 BOOST_FOREACH 的循环宏以及可迭代的有意识的函数。
长话短说,我在制作一个使用 BOOST_FOREACH 但传递了一个附加参数的枚举循环时遇到了困难,该参数在循环的每次迭代中都会递增。这很像 Python 中的 enumerate 命令,我发现它在循环任意迭代器而不添加大量样板代码时很有用。该宏采用类似 BOOST_FOREACH 的形式:
并且会有效地做到这一点,但不依赖于放置不平衡的'}'来关闭(或其他循环结束宏):
现在,在我被指责试图在 C++ 中创建非 C++ 运算符之前,我完全意识到这是将一个外来概念塞进 C++ 中,而我并没有尝试 Pythonize C++ 代码。我只是好奇是否完全可以使用已知的工具集/提升来实现这样的循环而没有极端依赖。拥有这样的宏定义将消除某些循环样式的错误来源,在这些样式中我需要在迭代时进行计数,并且它消除了 COUNT 变量的用途的歧义。
我考虑过在 COL 变量进入 BOOST_FOREACH 之前对其进行模板包装,但是 COL 的可能性数量使得在不制作不同版本的 ENUMERATE_FOREACH 并重新实现大量 BOOST_FOREACH 的情况下,使用一些可迭代变量的组合变得困难/不可能 - - 没有大量测试/时间的艰巨和愚蠢的任务。
做一个单独的内联函数可能会起作用,但是循环的语法会被破坏,我会遇到更多的 on-each 风格的运算符函数传递情况(我已经实现了)。
这让我不得不从 boost 的库中获取 foreach.hpp 的最后几行,并在附加参数上插入我自己的增量运算符。然后我变得依赖于 boost 版本,并担心新的更新(任何语法更改)会破坏我的 hacky 自定义宏。
我想到的最后一个选项是执行 ENUMERATE_BEGIN 和 ENUMERATE_END 来隐藏我的迭代器增量操作。这种方法比单个宏更容易出错,因为用户必须放置两个宏而不是一个——尽管这可能是唯一简单的解决方案。
我试着在 SO 和其他来源上四处寻找,看看是否有人在没有太多运气的情况下尝试过这个。希望有人成功地使用了这样的实现概念,或者对改变我的方法有想法。如果没有一种干净的方法可以做到这一点,我可以在我想计数时继续使用 count++ 开始我的循环。同样,这更像是一种好奇心,有人可能会提出我所争论的一个想法是一种完全合理的方法,或者尽可能好。
c++ - 如何使用预处理器从源文件中获取文本行?
我们有一个文件和一行(__file__
, __line__
),我们想打印它的内容。这样的事情可以通过预处理器实现吗?
c++ - 尽量避免重复调用函数
我有一个非常简单的类定义如下:
在哪里
或者
必须为所有成员函数调用。它的作用是获取类的成员函数指针并映射到字符串,因此稍后可以用字符串标识函数。
一切都很好并且工作正常,但是当类结构变大时,程序员将不得不为每个成员函数重复调用这个函数。无论如何要使用预处理器,或任何预处理库,如 boost-wave,这样程序员就不必进行这些重复调用?
编辑:很抱歉造成混淆,我在这里显然没有很好地描述问题。我将字符串映射到成员函数指针;
m_urlRules 是一个 std::map,以字符串为键,成员函数指针为值 regController 基本上是 m_urlRules 的设置器函数,因此这两个语句有效地执行相同的操作,将字符串映射到成员函数。
REG_NAME 是一个宏,用于替换非常难看的类型转换。
我想要做的是,如果类具有以下结构,
我不必在构造函数中执行以下操作:
c++ - Boost 是否使用合法的 C++ 预处理指令语法?
我的(相对较旧的)C++ 编译器在 Boost 中被这个文件阻塞,它的开头是:
这真的是合法的 C++ 吗?预处理器标记的语法规则是什么?
c++ - 如何通过定义隐藏字段并仅提供setter和getter?
我想知道如何隐藏一个真实的属性字段(不是将其设为私有或公共,而是强制使用 setter 和 getter)并为他提供简单的 setter 和 getter。所以我想知道如何创建 api,如:
如何通过 Boost 预处理器创建这样的东西?
c++ - 将任意数量的任意类型的值组合成单个字符串的简单命令
考虑以下代码。
它很好地将 << 前面的所有值组合在一个字符串中。我很想发现一个更短、更易于使用且代码重复更少的版本。此外,上面的代码只是一个例子,命令应该接受变量和字符串的任意组合。理想情况下是这样的:
即使使用 Boost.Preprocessor、内联函数和所有技巧,这在 C++中是否可能以可移植的方式实现。
c++ - 使用 Boost.Preprocessor 减少此代码重复
考虑以下代码:
ETC...
我最多需要 15 个参数。
我只是想知道是否可以使用 Boost.Preprocessor 来简化这种重复,以及我将如何去做。我浏览了文档,但它相当混乱。
c++ - 预处理器数组生成
我正在尝试创建一个宏来替换函数定义。这个宏应该在某个数组中注册函数的名称,以便其他宏可以对数组的元素做一些事情。
我想这样做以获得可以在控制台中使用的功能列表,而无需在添加新功能时编辑列表(它实际上是多个列表)。
在阅读了一下之后,我看了一下 boost 预处理器。不幸的是,似乎没有办法“保存”新数组。我想做的是这样的:
不幸的是,据我所知,redefine 不存在,#define 不能在宏中使用(如果我错了,请纠正我)。
我查看了 boost 的预编译器的 SLOT,但我认为一旦设置,我也无法更改其中的变量。
除了编写我自己的预处理器之外,还有什么方法可以做到这一点?不是,学习如何写一个好的开始是什么?(将 MinGW 与 Code::Blocks 一起使用)。
c++ - 将定义转换为 BOOST_PP_TUPLE 或 BOOST_PP_SEQ
是否可以转换#define Name Alex
为BOOST_PP_SEQ like (A)(l)(e)(x)
or BOOST_PP_TUPLE (A,l,e,x)
?对我更有用('A')('l')('e')('x')
或('A','l','e','x')
分别?
c++ - 如何创建代理类?
拥有N
没有公共数据字段的不同类,只有方法(不重叠),如何通过 boost 预处理器创建统一它们的所有代理类?
例如,我们有类:A 有方法do();
,B 有方法data();
。我想知道是否有一种方法(例如使用 Boost Preprocessor)来创建一个代理类,该类将具有来自 A 和 B 的所有方法(此处do()
data()
)和一个构造函数,该构造函数接收指向该类实例的指针——一个用于 A,一个用于 B ?
所以我们会得到类似这样的伪代码的api:
是否可以使用 boost::preprocessor 在 C++11 中创建这样的东西,或者这样的东西已经在 boost 中了?
此外,如果使用外部生成器可以实现这样的事情,那对我来说没问题。