Preprocessor initialize array

Как, по необходимости прибегнув к boost preprocessor, инициализировать массив по примеру:

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>


Ответы (1 шт):

Автор решения: user7860670
#include <boost/preprocessor/seq.hpp>
#include <boost/preprocessor/for.hpp>
#include <boost/preprocessor/stringize.hpp>

#include <array>
#include <iostream>
#include <string>
#include <utility>

#define BUILD_ARRAY_OP(A_r, A_dummy, A_elem) \
    ::std::pair<char const *, ::std::string>{BOOST_PP_STRINGIZE(A_elem), ::std::string{BOOST_PP_STRINGIZE(A_elem)}},

#define BUILD_ARRAY(A_seq) \
    ::std::array<::std::pair<char const *, ::std::string>, BOOST_PP_SEQ_SIZE(A_seq)> items \
    { \
        BOOST_PP_SEQ_FOR_EACH(BUILD_ARRAY_OP, A_dummy, A_seq) \
    }

int main()
{
    BUILD_ARRAY((plus)(minus)(multiply));
    for (auto const & item: items)
    {
        ::std::cout << item.first << " | " << item.second << ::std::endl;
    }
    return 0;
}
→ Ссылка