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