C ++ constexpr生成std :: vector

时间:2019-04-29 15:11:12

标签: c++ constexpr

我想基于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中的东西。

这个问题更多的是要解决我的好奇心,而不是提供完美的解决方案。我只是认为看看是否可以做到很有趣。

1 个答案:

答案 0 :(得分:1)

这是不可能的,因为std::vector被设计为不是constexpr,并且目前没有计划在即将发布的C ++标准版本中对此进行更改。

从理论上讲,您要尝试做的事情是可以理解的:std::vector默认使用动态分配的内存,但是可以给它分配一个分配器,该分配器从静态内存分配内存;并且这样做,有可能从理论上(有条件地)构成整个类constexpr;或至少是相关部分。

但是。目前根本不可能做到这一点。如果您想要一个constexpr容器,其大小根据编译条件而变化,则您需要自己汇总一些东西,因为std::vector根本不适合此目的。

如果您可以结合使用std::array和一些模板元编程黑魔法来获得所需的东西,也许可以做一些研究。已经有针对std::make_array的建议,它是在编译时获取程序员不一定具有远见的数组的一种方法;因此,请查看是否可以将类似的解决方案应用于您的问题。