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

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

是否可以使用Boost来“迭代”这些常量名称?像宏这样的东西,它扩展了生成foo1foo2fooN的功能,并让我对它们做一些事情。我相信可以使用某些Boost库来完成此操作,但是我找不到它。

顺便说一句,这种技术是否有合适的名称?

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

最佳答案

我更改了您的示例,以从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() {}

在这里,预处理器生成一个可以初始化const std::map的initalizer_list。如果需要,您可以使用constexpr和模板来做更多疯狂的const事情。

虽然仅仅因为有可能,但这并不意味着我建议您在真实的代码库中这样做。

关于c++ - “Iterate”在 namespace 内定义的常量上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15303221/

10-11 22:24
查看更多