我想使用宏或模板元编程为我生成一些代码

问题描述 投票:0回答:1

我需要像这样定义一个枚举


    enum class MyEnum { MyEnum1 = 0x0001, MyEnum2 = 0x0002, MyEnum3 = 0x0004, MyEnum4 = 0x0008, MyEnum5 = 0x0010 };

所以基本上这些枚举值被枚举索引移位 1 我想避免任何拼写错误,以防将来添加新的枚举值,我可以简单地为命名枚举定义一个字符串数组并为其生成函数并返回基于枚举索引的值。

这可以分解成这样。假设我有一个数组

    constexpr std::array<const char*, 3> arr = {"Foo", "Bar", "Baz"};
    
    //Now at compile time i want to generate functions 
    constexpr int getFoo() { return 0; }
    constexpr int getBar() { return 1; }
    constexpr int getBaz() { return 2; }

基本上我想遍历数组并在数组中的值上生成 getter 函数并返回数组中的索引。

不确定是否可能但隐约记得这样的代码是在宏中使用##生成的

c++ templates c++14 template-meta-programming template-specialization
1个回答
0
投票

我需要定义一个枚举,例如 enum class MyEnum { MyEnum1 = 0x0001, MyEnum2 = 0x0002, MyEnum3 = 0x0004, MyEnum4 = 0x0008, MyEnum5 = 0x0010 };

看看

macro_sequence_for
。这几乎与自述文件中的第一个示例完全匹配。

在 gcc.godbolt.org 上运行

#include "macro_sequence_for.h"

#define MAKE_FLAGS(name, seq) enum name {SF_FOR_EACH(BODY, STEP, FINAL, 0, seq)};
#define BODY(n, d, x) x = 1 << (d),
#define STEP(n, d, x) d+1
#define FINAL(n, d) _mask = (1 << (d)) - 1

MAKE_FLAGS(E, (a)(b)(c))

扩展为:

enum E
{
    a = 1 << (0),                // 0b0001
    b = 1 << (0+1),              // 0b0010
    c = 1 << (0+1+1),            // 0b0100
    _mask = (1 << (0+1+1+1)) - 1 // 0b0111
};

如果您不需要组合面罩,请取下

#define FINAL
并在其位置上传递
SF_NULL

全面披露——我是图书馆的作者。

© www.soinside.com 2019 - 2024. All rights reserved.