我将您的示例更改为从 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 事情。
仅仅因为它是可能的并不意味着我会建议在真实的代码库中进行。