【发布时间】:2021-07-28 11:46:06
【问题描述】:
好的,所以我在 c++ 中实现类似 system 的 c# 属性时遇到了问题(请参阅:https://stackoverflow.com/a/68557896/3339838)。
考虑以下示例:
struct TransformCmp
{
PropertyDelGetSet<vec3> position =
PropertyDelGetSet<vec3>(
[&]() -> const vec3& { return m_position; },
[&](const vec3& val) { m_position = val; m_dirty = true; });
private:
bool m_dirty = true;
vec3 m_position = vec3(0);
}
如果/当复制/移动 TransformCmp 的实例时(例如,如果它存储在 std::vector 并调用了调整大小),则引用捕获现在无效。
问题是我如何确保在复制/移动发生时我也更新了引用捕获?
我尝试为 Property 类实现复制构造函数,但遇到了同样的问题,可能是因为我没有正确执行。有什么想法吗?
更新:
我正在尝试与 Matthias Grün 建议的仿函数类似的想法,基本上我将 TransformCmp 指针传递给 PropertyDelGetSet 构造函数,该构造函数将传递给 get-set 函数。
初始化属性时,我正在做这样的事情:
PropertyDelGetSet<TransformCmp, vec3> position =
PropertyDelGetSet<TransformCmp, vec3>(this, // <- now passing this
[](TransformCmp* p) -> const vec3& { return p->m_position; },
[](TransformCmp* p, const vec3& val) { p->m_position = val; p->m_dirty = false; });
但是,我需要能够更新存储在 PropertyDelGetSet 中的指针才能使其正常工作。
【问题讨论】:
-
由于您无法直接访问实现引用捕获的数据,因此您无法“更新”引用捕获。因此,您将不得不重新创建 lambda。或者您不使用 lambdas(但自己实现闭包类型)。更一般地说,您已经创建了一个自引用类型。
-
我可以使用复制构造函数重新创建 lambda 吗?
标签: c++11 lambda copy-constructor move-constructor