gpt4 book ai didi

c++ - 如何使用 Boost 预处理器扩展字符串

转载 作者:搜寻专家 更新时间:2023-10-31 00:13:13 24 4
gpt4 key购买 nike

我想用 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;

最佳答案

由于预处理器仅适用于标记,因此您必须提供传递给 foo 的字符串的长度作为硬编码的魔术常量,即整数文字。没有办法解决这个问题。
而且由于这个整数文字将独立于字符串文字,所以整个方法容易出错,应该避免。

如果您正在寻找灵活的扩展,请尝试使用可变参数模板。 (很难说出您应该使用什么,因为您没有提供您需要它的用例!)

关于c++ - 如何使用 Boost 预处理器扩展字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27603912/

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