1

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

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

是否可以使用 Boost 来“迭代”这些常量名称?类似于宏的东西,它扩展了 generate ,foo1并让我对每个做一些事情。我相信这可以使用一些 Boost 库来完成,但我找不到它。foo2fooN

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

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

4

3 回答 3

4

您可以使用Boost Preprocessor 库来实现这一点。

BOOST_PP_SEQ_FOR_EACH似乎最相关。

于 2013-03-08T21:06:27.603 回答
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 和模板做更多疯狂的 const 事情。

仅仅因为它是可能的并不意味着我会建议在真实的代码库中进行。

于 2013-03-08T21:47:23.993 回答
0

这将需要 c++ 没有的元数据。您可以提出一些自定义宏并使用 foomax 和 foomin 之类的约定,但我知道没有库。

于 2013-03-08T21:04:11.067 回答