“迭代”在命名空间内定义的常量

时间:2013-03-08 21:01:46

标签: c++ boost macros

假设我在命名空间中定义了一堆常量:

namespace FooConstants{
    const string foo1 = "foo1";
    const string foo2 = "foo2";
    //...
    const string fooN = "fooN";
}

是否可以使用Boost来“迭代”这些常量名称?像宏这样可以将foo1foo2生成fooN扩展到{{1}},并让我对每个内容做一些事情。我相信这可以使用一些Boost库来完成,但我找不到它。

顺便问一下,这种技术有没有合适的名称?

编辑:我被要求澄清这是否可以在编译或运行时解决。答案是编译时间:我想生成对所有常量进行操作的代码。

3 个答案:

答案 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这样的惯例,但是我没有知道库。