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;
}