コンマの生成を簡素化するために、定数の番号付けを 0 から開始するように例を変更しましたが、コンパイル時に発生することで、これを確実に実行できます。
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/iteration/local.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <utility>
#include <string>
#include <map>
namespace FooConstants{
const std::string foo0 = "foo0";
const std::string foo1 = "foo1";
const std::string foo2 = "foo2";
const std::string foo3 = "fooN";
#define N 3
}
namespace metadata {
const std::map<int, std::string> constants = {
#define BOOST_PP_LOCAL_MACRO(n) \
BOOST_PP_COMMA_IF(n) \
std::make_pair(n, BOOST_PP_CAT(FooConstants::foo,n))
#define BOOST_PP_LOCAL_LIMITS (0, N)
#include BOOST_PP_LOCAL_ITERATE()
};
}
int main() {}
ここで、プリプロセッサは を初期化できる initalizer_list を生成しconst std::map
ます。ただし、必要に応じて、constexpr とテンプレートを使用して、よりクレイジーな const を実行できます。
可能だからといって、実際のコード ベースで実行することをお勧めするわけではありません。