長さ不明の文字列を Boost のプリプロセッサ ライブラリで展開したい。
たとえば、私はこれが欲しい:
const string foo{"bar"};
私のマクロでこれに展開するには:
foo[0]、foo[1]、foo[2]、'\0'
これが私のコードです。これは主にhereからコピーしたものです。
#include <boost/preprocessor/arithmetic/add.hpp>
#include <boost/preprocessor/arithmetic/inc.hpp>
#include <boost/preprocessor/arithmetic/sub.hpp>
#include <boost/preprocessor/control/deduce_d.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#define EXPAND(first, last) BOOST_PP_REPEAT( BOOST_PP_INC( BOOST_PP_SUB((last), (first)), EXPAND_M, ((first), BOOST_DEDUCE_D())), '\0'
#define EXPAND_M(z, n, data) EXPAND_M_2((n), BOOST_PP_TUPLE_ELEM(2, 0, (data)), BOOST_PP_TUPLE_ELEM(2, 1, (data)))
#define EXPAND_M_2(n, first, d) foo[BOOST_PP_ADD_D((d), (n), (first))],
このまま使ってもいいですか?
const string foo{"bar"};
cout << string{ EXPAND(0, foo.size()) } << endl;