将 C++20 模板化 Lambda 传递给函数然后调用它

2023-12-02

我试图将模板化 lambda 传递给函数,然后使用模板参数调用它,以启用该函数针对自定义类型的专门化。

但是当我尝试调用 lambda 时,出现此错误:error: invalid operands to binary expression

对于任何想尝试这个的人来说,这是一个 godbolt 链接:https://gcc.godbolt.org/z/qYPcea

#include <cstdint>
#include <string>
#include <cstring>

enum class Alignment : uint8_t {
    
    one,
    two,
    four,
    eight
};

template <Alignment alignment, typename T>
static void align(T& pointer)
{
    intptr_t& value = reinterpret_cast<intptr_t&>(pointer);
    value += (-value) & ((uint64_t)alignment - 1);
}

template<typename Lambda, typename T>
static void specialization(Lambda&& lambda, const T& t) 
{
   lambda<Alignment::eight>(t.data(), t.size());
}

int main()
{
    uint8_t buffer[1024];

    void *writeTo = buffer;

    auto lambda = [&] <Alignment alignment> (const void *input, uint32_t inputSize) -> void
    {
        align<alignment>(writeTo);
        writeTo = memcpy(writeTo, buffer, inputSize);
    };
    
    std::string input("helloworld");

    specialization(lambda, input);

    return 0;
}

问题是 lambda 不是类模板,它们只是成员调用运算符的常规类,即operator()是模板化的。

当为泛型 lambda 推导模板参数时,这种区别并不明显(这是一件非常好的事情)。

所以在你的例子中,lambda不是类模板,但您使用的语法将用于类,而不是成员函数。

如果您想显式指定 lambda 的模板参数,则需要说明您正在调用该成员operator() of lambda,并且您需要说它是一个要消除歧义的模板。

lambda.template operator()<Alignment::eight>(t.data(), t.size());

这是您的代码版本compiles.

#include <cstdint>
#include <string>
#include <cstring>

enum class Alignment : uint8_t {
    
    one,
    two,
    four,
    eight
};

template <Alignment alignment, typename T>
static void align(T& pointer)
{
    intptr_t& value = reinterpret_cast<intptr_t&>(pointer);
    value += (-value) & ((uint64_t)alignment - 1);
}

template<typename Lambda, typename T>
static void specialization(Lambda&& lambda, const T& t) 
{
   lambda.template operator()<Alignment::eight>(t.data(), t.size());
}

int main()
{
    uint8_t buffer[1024];

    void *writeTo = buffer;

    auto lambda = [&] <Alignment alignment> (const void *input, uint32_t inputSize) -> void
    {
        align<alignment>(writeTo);
        writeTo = memcpy(writeTo, buffer, inputSize);
    };
    
    std::string input("helloworld");

    specialization(lambda, input);

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 C++20 模板化 Lambda 传递给函数然后调用它 的相关文章

随机推荐

  • 如何让新的小部件填充可用空间?

    我在让新的 QT 小部件填充所有可用空间时遇到一些麻烦 我想将一个小部件 QGLWidget 添加到垂直布局 mVisual 并调整布局大小 以便 mVisual 占据最大面积 我的布局如下所示 我的代码是 ui setupUi this
  • 输入键模拟单击对复选框不起作用

    我复制并稍微修改了底部的代码这个帖子允许在我创建的工作表表单上的表单控件之间进行 Tab 键切换 以下是与 KeyCode vbKeyEnter 相关的部分 Select Case KeyCode Case vbKeyTab Dim Bac
  • Delphi网络摄像头简单程序

    任何人都可以帮助我使用 delphi 中的一个简单的 TVideo 组件创建一个简单的 cam 视图 视频大小默认为 160x120 不调整大小 只是一个简单的 请 我的新项目急需 thanks 有很多方法可以做到这一点 我无法理解 TVi
  • numpy where 函数的基础知识,它对数组有什么作用?

    我看过帖子了nonzero a where a 和 argwhere a 之间的差异 什么时候用哪个 我不太明白 numpy 模块中 where 函数的用法 例如我有这个代码 import numpy as np Z np array 1
  • 如何增加 Torque 作业的 OpenFabrics 内存限制?

    当我通过 InfiniBand 运行 MPI 作业时 出现以下磨损情况 我们使用扭矩管理器 WARNING It appears that your OpenFabrics subsystem is configured to only a
  • 使用 C++ 的原理与实践中头文件中的错误消息

    我刚刚开始使用 编程 使用 C 的原理和实践 学习 C 那本书告诉我使用一个头文件来为我设置一些东西 有问题的头文件位于http www stroustrup com Programming std lib facilities h 我正在
  • WPF 中的用户控件位置

    我是 WPF 新手 我创建了一个新的 UserControl MyUserControl 现在我很惊讶 UserContol 没有位置 我如何读取 通过代码 myUserControl1 Location在父容器中 我解释 我有一些点 用户
  • Docusign 代表发送 (SOBO)

    如果有人有 我欢迎提供有关如何使用 Docusign 的代表发送 SOBO 功能的示例 我正在使用带有 XML 的 SOAP API 甚至 Docusign 的 III 级支持也无法提供示例 Thanks 2021 年 4 月更新 新的 R
  • java.rmi.ConnectException:连接拒绝主机:127.0.1.1;

    java rmi ConnectException Connection refused to host 127 0 1 1 nested exception is java net ConnectException Connection
  • 如何将 JPA 字段持久化为 clob?

    我有一个类不能很好地序列化为关系实体 因此 我想使用 JPA 作为 CLOB 来持久化它 我可以将它序列化为字符串 我该如何使用 JPA 来做到这一点 示例实体 Entity Table name MY TABLE public class
  • 如何使用 const getter 对 std::set 进行排序

    我有一个 std set 容器 其元素是以下类的对象 class LaneConnector public const Lane getLaneFrom const return From const Lane getLaneTo cons
  • 上午 12 点和下午 12 点的时间正则表达式

    我做了这个正则表达式 00 0 0 9 1 012 0 5 0 9 a p m A P M 但问题是它正在接受 00 00 am 我不想这样 如何忽略 我希望时间采用这种格式 上午 12 12 它不应该在这个 上午 00 21 我正在使用此
  • Spring Boot 触发完全重启,而不是在静态文件发生更改时重新加载

    In my Spring Boot项目我有以下结构 src main java resources static css js img webapp WEB INF views 根据文档排除资源 里面的资源static 应该触发一个relo
  • Woocommerce 产品自定义字段:检查输入是否已存在

    我安装了这个 WC Fields Factory 插件来向产品添加新字段 但我需要检查这个新文本框的值是否已存在于数据库中 举个例子 比如在注册时您不能使用已在使用的电子邮件 我必须像屏幕上一样添加文本字段 Update 2 处理字段验证
  • 在视频中跳转到数组中的时间

    沿着以下路线控制 HTML5 视频中的开始位置和播放时长 我试图在每个片段播放完毕后自动从一个片段跳转到下一个片段 每个分段将具有相同的持续时间 并且每个分段的开始时间将位于一个数组中 我似乎无法弄清楚如何在 addEventListene
  • 读取访问冲突 0xCDCCDCCD

    我不断遇到读取访问冲突 这是我的代码 class List public List List const List copy List List operator const List rhs Record headPtr const vo
  • 活动更改的翻转动画

    我想在两个活动之间切换 就像 iPhone 一样 我尝试使用 overridePendingTransition int EnterAnim int exitAnim 方法 但没有成功 有人实现过这样的动画吗 fesp 当您必须更改 Act
  • Java 原生数组长度

    我在 Java 中有一个二维双精度数组 它基本上是一个值表 我想知道它有多少行 它在其他地方声明 并分配 如下 double table 然后传递给一个函数 private void doSomething double table 在我的
  • Java 和 SQL:返回 null 还是抛出异常?

    这是另一个有争议的主题 但这次我只寻找简单且有记录的答案 场景 我们假设以下方法 我会避免以下情况 sql append SELECT FROM append dogs table sql append WHERE append colNa
  • 将 C++20 模板化 Lambda 传递给函数然后调用它

    我试图将模板化 lambda 传递给函数 然后使用模板参数调用它 以启用该函数针对自定义类型的专门化 但是当我尝试调用 lambda 时 出现此错误 error invalid operands to binary expression 对