c++ - 预处理器初始化数组
问题描述
如有必要,如何使用 boost 预处理器初始化数组,如下所示:
INIT_ARRAY(plus,minus)
//extract to
std::array<std::pair<char const *,std::string>, 2> array{{
{"plus", std::string("plus")}, {"minus", std::string("minus")} }};
INIT_ARRAY(plus,minus,multiply)
//extract to
std::array<std::pair<char const *,std::string>, 3> array{{
{"plus", std::string("plus")}, {"minus", std::string("minus")}, {"multiply", std::string("multiply")} }};
PS 无法解决初始化程序中最后一个逗号的问题(...{n-1} , {n} ,)
并计算要传递给std::array<...,n>
. 我使用预处理器,因为传递给宏的名称稍后将用于代码生成。用过 c++20
解决方案
您可以使用BOOST_PP_COMMA_IF
条件逗号,并BOOST_PP_VARIADIC_SIZE
预先计算出大小。
这应该有效(对于非空数组):
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/stringize.hpp>
#include <boost/preprocessor/variadic/size.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>
#define INIT_ARRAY_INITIALIZER(r, _, i, e) BOOST_PP_COMMA_IF(i) {BOOST_PP_STRINGIZE(e), std::string(BOOST_PP_STRINGIZE(e))}
#define INIT_ARRAY(...) \
std::array<std::pair<char const *, std::string>, \
BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)> array{{ \
BOOST_PP_SEQ_FOR_EACH_I(INIT_ARRAY_INITIALIZER, _, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)) \
}};
推荐阅读
- eclipse - 如何将 eclipse formatter.xml 转换为 Checkstyle 规则
- python - 如何使用“包含”过滤器进行查询但不区分大小写?
- java - 安卓。JSON 解析器在我的新模块中返回 null
- python - 追加正在覆盖类列表中的现有数据
- c# - 创建自定义控件并将其添加到 Xamarin 中的 ListView。但它只在我双击时触发。我希望 ItemTapped 在单击时触发
- if-statement - 计算两个互斥的类别行中的项目数
- python - Django:具有过滤的多对多的多个分组注释
- python - Python Dictionary 如何创建列表项的组合?
- android - 用于多模块项目的 Firebase
- apache - Symfony 5 - 多个客户端域