假设我在命名空间中定义了一堆常量:
namespace FooConstants{
const string foo1 = "foo1";
const string foo2 = "foo2";
//...
const string fooN = "fooN";
}
是否可以使用Boost来“迭代”这些常量名称?像宏这样可以将foo1
,foo2
生成fooN
扩展到{{1}},并让我对每个内容做一些事情。我相信这可以使用一些Boost库来完成,但我找不到它。
顺便问一下,这种技术有没有合适的名称?
编辑:我被要求澄清这是否可以在编译或运行时解决。答案是编译时间:我想生成对所有常量进行操作的代码。
答案 0 :(得分:4)
您可以使用Boost Preprocessor library实现此目的。
BOOST_PP_SEQ_FOR_EACH似乎最相关。
答案 1 :(得分:2)
我改变了你的例子,在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和模板做更多疯狂的常量。
仅仅因为它可能并不意味着我建议在真正的代码库中进行。
答案 2 :(得分:0)
这需要c ++没有的元数据。你可以想出一些海关宏并使用像foomax和foomin这样的惯例,但是我没有知道库。