C++中如何限制回调Lambda的参数仅为Drawing&引用类型?
问题:强制回调必须以引用接收Drawing参数
我正尝试设计如下简单函数:
void draw(Callback callback) { Drawing drawing("name"); callback(drawing); std::cout << drawing.name() << std::endl; }
其中drawing需要以引用形式传递给回调,以便调用者可以修改它,示例如下:
draw([](auto& drawing) { drawing.set_name("another name"); });
当前显式将回调参数声明为auto&(或Drawing&)的写法可行,但如果仅声明为auto(或Drawing),代码仍会编译,但drawing实例会被拷贝而非按引用传递,无法达到修改原对象的预期效果。
我希望当Lambda参数未显式声明为引用时,代码无法通过编译。
我已尝试以下几种方案:
using Callback = std::function<void(Drawing&)>;:未显式声明auto&时,原drawing不会被修改(Lambda接收的是拷贝),但代码仍能编译,不符合要求。template<typename T> concept Callback = std::is_invocable<void, T, Drawing&>;:效果同上,无法阻止使用拷贝参数的Lambda通过编译。using Callback = void (*)(Drawing&);:此方案能阻止非引用参数的Lambda编译,但无法使用带捕获的Lambda,灵活性不足。
那么该如何正确定义Callback类型,使得Lambda的参数只能是Drawing&?
内容的提问来源于stack exchange,提问作者katkak
相关产品推荐
相关产品推荐

