我想基于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中的东西。
这个问题更多的是要解决我的好奇心,而不是提供完美的解决方案。我只是认为看看是否可以做到很有趣。
答案 0 :(得分:1)
这是不可能的,因为std::vector
被设计为不是constexpr
,并且目前没有计划在即将发布的C ++标准版本中对此进行更改。
从理论上讲,您要尝试做的事情是可以理解的:std::vector
默认使用动态分配的内存,但是可以给它分配一个分配器,该分配器从静态内存分配内存;并且这样做,有可能从理论上(有条件地)构成整个类constexpr
;或至少是相关部分。
但是。目前根本不可能做到这一点。如果您想要一个constexpr
容器,其大小根据编译条件而变化,则您需要自己汇总一些东西,因为std::vector
根本不适合此目的。
如果您可以结合使用std::array
和一些模板元编程黑魔法来获得所需的东西,也许可以做一些研究。已经有针对std::make_array
的建议,它是在编译时获取程序员不一定具有远见的数组的一种方法;因此,请查看是否可以将类似的解决方案应用于您的问题。