You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:14:54