首页 > 解决方案 > 预处理器初始化数组

问题描述

如有必要,如何使用 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

标签: c++boostpreprocessor

解决方案


您可以使用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__)) \
}};

推荐阅读