如何使用 Boost 预处理器扩展字符串
How Can I Use Boost preprocessor to Expand a String
我想用 Boost 的预处理器库扩展一个未知长度的字符串。
例如,我想要这个:
const string foo{"bar"};
由我的宏扩展为:
foo[0], foo[1], foo[2], '\0'
这是我的代码,我主要从这里复制:
#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())), ' '
#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
的字符串长度作为硬编码的魔术常量,即整数文字。这是没有办法的。
由于此整数文本独立于字符串文本,因此整个方法容易出错,应避免使用。
如果您正在寻找灵活的扩展,请尝试使用可变参数模板。(很难说你应该使用什么,因为你没有提供你需要这个的用例!
您是否只是在寻找一种包含(尾随(NUL 字符的方法?
#include <algorithm>
#include <iterator>
#include <iostream>
#include <sstream>
template <typename R = std::string, size_t N>
R stringlit(char const(&lit)[N]) {
return R(lit+0, lit+N);
}
static std::string const foo(stringlit("bar"));
static auto const bar(stringlit<std::vector<int>>("bar"));
int main() {
std::cout << "foo: ";
for(char ch : bar)
std::cout << std::showbase << std::hex << static_cast<int>(ch) << " ";
std::cout << "nbar: ";
for(int i : bar)
std::cout << std::showbase << std::hex << i << " ";
}
指纹
foo: 0x62 0x61 0x72 0
bar: 0x62 0x61 0x72 0
也许相关的变化:
您还可以使用模板别名来使用临时显式指定数组文本的大小:
template <typename T> using Alias = T;
static std::string const foo(stringlit(Alias<char[7]>{"bar"})); // 4 trailing ' 's
相关文章:
- 在另一个字符串中插入文件扩展名之前的字符串
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- URL 编码扩展的 ASCII 标准::字符串在 C++.
- QProcess::执行环境变量扩展字符串
- 调试宏中的字符串变量扩展
- 如何在字符串中插入扩展的ascii字符
- 如何将宏值扩展到宽字符串
- 作为字符串 c/C++ 的宏名称扩展
- 通过添加构造函数和一些成员函数来扩展 std::(w)字符串
- 扩展字符串流错误C++
- 我可以在字符串化之前强制未定义的宏扩展吗?
- 如何使用 Boost 预处理器扩展字符串
- OMNeT++ TicToc 扩展字符串消息
- 在扩展字符串中查找第 k 个元素
- 如何从boost::wave中获取完整的、扩展的、字符串化的宏
- 需要帮助将可变宏扩展为字符串化名称和值序列
- C/C++宏扩展到参数,参数为字符串
- 在扩展中创建字符串流的日志宏
- PHP扩展如何从方法返回字符串
- 在 C++11 中,应该首先发生什么:原始字符串扩展或宏