【问题标题】:C++ constexpr to generate std::vectorC++ constexpr 生成 std​​::vector
【发布时间】:2019-04-29 15:11:11
【问题描述】:

我想根据 lambda 中的代码为向量生成代码。我认为也许有一种方法可以使用 constexpr 来做到这一点,但我认为这需要一些特别聪明的东西。 this 之类的东西似乎很相关,但我想要生成它的方式比提供的更不透明。一个代码示例将说明这一点:

考虑:

auto a = [&]() {
    if(!mem_retire_port->empty() && occupied) {
        auto addr = mem_retire_port->peek()->data.addr;
        if(addr == insns[idx]->ws.pc) {
            occupied = false;
            mem_retire_port->pop();
            insn_decode_port->push(new insn_decode_event_t(insns[idx]));
            idx = (idx + 1) % insns.size();
        }
    }
});

我想生成一个 std::vector 形式的

std::vector<std::function<std::string()>> generated_vector = {mem_retire_port->get_name, insn_decode_port->get_name};

这些信息显然可供程序员使用,但我想知道是否可以在编译时以编程方式确定这一点。可能是 operator-> 上的 constexpr 或用于确定变量是否在 lambda 中的东西。

这个问题更多是为了解决我的好奇心,而不是提供一个完美的解决方案。我只是觉得看看能不能完成会很有趣。

【问题讨论】:

  • FWIW,vector 必须动态分配空间,因此即使初始化程序是 constexpr,它也不会在运行时初始化。
  • 如果不出意外,那么您通过引用 ([&amp;]) 对所有内容的广泛捕获将使这或多或少不可能在编译时进行评估。
  • C++20 是第一个部分支持 constexpr new 的 C++ 标准。我不知道这是否足以做你想做的事,部分原因是我不明白你想要实现什么。
  • @NathanOliver C++20 在constexpr 上下文中添加了(一些)对动态内存分配的支持,前提是分配的内存也在同一个constexpr 上下文中释放。
  • 我会用std::array 代替constexpr,就像这个一样。无论如何,这看起来像XY problem

标签: c++ constexpr


【解决方案1】:

这是不可能的,因为 std::vector 被设计为不是 constexpr,目前没有计划在任何即将发布的 C++ 标准版本中更改这一点。

理论上,您尝试做的事情是可以理解的:std::vector 默认使用动态分配的内存,但可以给它一个分配器,从静态内存中分配内存;在这样做的过程中,理论上可以(有条件地)使整个班级constexpr;或者至少是相关部分。

但是。这现在根本不可能。如果你想要一个大小随编译条件变化的constexpr容器,你需要自己卷起来,因为std::vector根本不适合这个目的。

也许做一些研究来确定你是否可以使用std::array 和一些模板元编程黑魔法来获得你需要的东西。已经有一个针对std::make_array 的提议,这是在编译时获得一个数组大小的一种方法,程序员不一定能预见到该数组的大小;因此,请查看是否可以将类似的解决方案应用于您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-22
    • 2021-11-19
    • 2021-09-06
    • 2022-01-03
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多