我正在尝试设计一个像这样的简单函数:
void draw(Callback callback)
{
Drawing drawing("name");
callback(drawing);
std::cout << drawing.name() << std::endl;
}
wheredrawing
应该作为引用传递给回调,以便调用者可以像这样修改它:
draw([](auto& drawing) {
drawing.set_name("another name");
});
现在这可以工作了,因为我将回调参数显式键入为auto&
(或Drawing&
)。但是,当我仅将参数键入为auto
( 或Drawing
) 时,代码也会编译,但不再按预期工作。该drawing
实例是复制的,而不是通过引用传递的。
当 lambda 参数未显式键入为引用时,我希望代码不再编译。
我尝试过以下方法:
using Callback = std::function<void(Drawing&)>;
:drawing
当未明确键入 as 时不会被修改auto&
。template<typename T> concept Callback = std::is_invocable<void, T, Drawing&>;
: 和上面一样。using Callback = void (*)(Drawing&);
:这确实有效,但我失去了使用捕获的能力。
那么我该如何正确输入 Callback 以便只有Drawing&
lambda 才是有效的参数呢?