预处理器初始化数组

Preprocessor initialize array

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

P.S。无法解决初始化程序中最后一个逗号的问题 (...{n-1} , {n} ,) 并计算要传递给 std::array<...,n> 的参数数量。我使用预处理器,因为传递给宏的名称稍后将用于代码生成。使用 c++20

您可以使用BOOST_PP_COMMA_IF for conditional commas, and BOOST_PP_VARIADIC_SIZE预先计算出尺寸。

这应该有效(对于 non-empty 数组):

#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__)) \
}};