【发布时间】:2015-02-20 14:59:19
【问题描述】:
我想用 Boost 的预处理器库扩展一个未知长度的字符串。
例如我想要这个:
const string foo{"bar"};
由我的宏扩展为:
foo[0], foo[1], foo[2], '\0'
这是我的代码,大部分是从here复制过来的:
#include <boost/preprocessor/arithmetic/add.hpp>
#include <boost/preprocessor/arithmetic/inc.hpp>
#include <boost/preprocessor/arithmetic/sub.hpp>
#include <boost/preprocessor/control/deduce_d.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#define EXPAND(first, last) BOOST_PP_REPEAT( BOOST_PP_INC( BOOST_PP_SUB((last), (first)), EXPAND_M, ((first), BOOST_DEDUCE_D())), '\0'
#define EXPAND_M(z, n, data) EXPAND_M_2((n), BOOST_PP_TUPLE_ELEM(2, 0, (data)), BOOST_PP_TUPLE_ELEM(2, 1, (data)))
#define EXPAND_M_2(n, first, d) foo[BOOST_PP_ADD_D((d), (n), (first))],
我可以这样用吗?
const string foo{"bar"};
cout << string{ EXPAND(0, foo.size()) } << endl;
【问题讨论】:
-
长度必须是文字形式。
-
@Columbo Welp,这有点破坏了整个计划。我想这是有道理的。由于这是预处理器,预处理器如何知道何时停止?如果我能以某种方式将值绑定回
foo,而不是使用硬编码的3,我的代码会更简洁。你知道有什么方法可以做到这一点,只要 foo 是在编译时定义的? -
预处理器仅适用于令牌。标记 3 必须包含在某处,你甚至不能编写一个函数来将字符串文字的长度作为整数文字。
-
@Columbo 你能把这个写成我接受的答案吗?并不是说我对此感到高兴,因为这意味着我浪费了很多时间:(
-
我对我的回答有点不满意(事实上我得到了支持)。你能提供更多的上下文吗?您是否只是选择将字符串扩展为字符序列?通过使用上限(例如 256)确实可以做到这一点。Boost.PP 的重复是可能的,但也可以使用自己的二进制递归方法。 '
标签: c++ boost recursion macros boost-preprocessor