【问题标题】:"Iterate" over constants defined inside a namespace“迭代”命名空间内定义的常量
【发布时间】:2013-03-08 21:01:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你知道N吗?
  • 假设它是硬编码的,但我想解决一般情况(任何 N 值)

标签: c++ boost macros


【解决方案1】:

您可以通过Boost Preprocessor library 实现此目的。

BOOST_PP_SEQ_FOR_EACH 似乎最相关。

【讨论】:

    【解决方案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 事情。

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

    【讨论】:

    • 看起来不错。但是你为什么不鼓励做这样的事情呢? (除了它使代码看起来有点难看之外)
    • @dario_ramos 是“奇码”,意味着维护成本总是会更高。再加上我不相信它会比一开始就将常量粘贴到地图中为你赢得任何东西,我认为我不会试图在愤怒中使用它。
    【解决方案3】:

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

    【讨论】:

    • @dario 您的问题并没有真正说明“对每个都做某事”是否应该在编译时或运行时发生。也许你应该澄清一下。
    • 使用宏和约定,我认为这个问题在运行时是不可能的。
    • 如果常量被导出,也可以在运行时进行。不便携,但仍然可行。
    猜你喜欢
    • 2013-06-03
    • 2014-09-02
    • 2013-06-12
    • 2013-03-20
    • 1970-01-01
    • 2011-12-18
    • 2015-06-02
    • 2016-04-05
    • 2013-08-17
    相关资源
    最近更新 更多