lambda函数使用其参数作为模板参数调用模板函数

2023-12-29

以下是示例代码,无法编译。

We use 迭代函数来迭代某个范围并运行 lambda 回调函数。这iterate函数将传递一些指示(即type) 到回调 lambda 函数,然后该函数将根据指示进行工作。由于这些指示在编译时是固定的,我相信有一种方法可以消除运行时的所有指示开销。但如何..?

template<typename FuncT>
void iterate(const FuncT& func) {
    for(int i = 0; i < 5; ++i)
        func(0, i);
    for(int i = 0; i < 5; ++i)
        func(1, i);
}

template<int d> int getValue(int i) { return d+i; }
// this has run-time overhead compared to the template version
// int getValue(int d, int i) {return d+i; }

int main() {
    iterate([&](const int type, int index){
        // error: cannot compiler here
        // candidate template ignored: invalid explicitly-specified argument for template parameter 'd'
        std::cout<<getValue<type>(index)<<std::endl;
    });
}

您不能使用运行时变量作为模板参数,它应该是编译时常量。但你可以将常量包装成std::integral_constant https://en.cppreference.com/w/cpp/types/integral_constant将常量值编码为类型:

template<typename Func>
void iterate(Func func) {
    for(int i = 0; i < 5; ++i)
        func(std::integral_constant<int, 0>{}, i);
    for(int i = 0; i < 5; ++i)
        func(std::integral_constant<int, 1>{}, i);
}

template<int d>
int getValue(int i) {
    return d + i;
}

int main() {
    iterate([&](auto type, int index) {
        std::cout << getValue<type>(index) << std::endl;
    });
}

std::integral_constant可以隐式转换为基础类型的值。在getValue<type>(index), type转换为 type 的包装值int.

Demo https://godbolt.org/z/QJmp8m

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

lambda函数使用其参数作为模板参数调用模板函数 的相关文章

随机推荐

  • 利用Android 4.4 KitKat中的半透明状态栏

    当我发布适用于 Android 4 0 4 3 的笔记应用程序时 我使用了自定义操作栏颜色和自定义操作栏图标 而不是使用标准的浅色和深色操作栏 我想在 Android 4 4 上做到这一点 状态栏也将采用我在操作栏中使用的自定义颜色 FFD
  • Play Framework scala 如何创建临时变量

    嗨 所以我有一个 while 循环 for i lt 0 until consoles size Do something Add records to a column 但我想添加一个变量 并根据发生的情况将其添加到不同的组 例如 var
  • Spark Streaming现在支持Kafka 1.1.0吗?

    现在spark版本是2 3 我看到了maven中央存储库 https search maven org search 7Cga 7C1 7Cg 3A 22org apache spark 22 https search maven org
  • gnuplot:绘制来自标准输入的两个数据集

    我在尝试从 gnuplot 中的 stdin 绘制两个不同的数据集时遇到一些问题 这是我正在测试的命令 gnuplot persist lt
  • 在 NSArray 中搜索最近的数字

    有没有一种简单的方法可以搜索NSArray找到与用户输入数字最接近 或精确 如果存在 匹配的数字 假设我有一个像这样的数组 7 23 4 11 18 2 然后用户输入5 该程序按紧密度降序返回三个最接近的值 4 7 2 and 最重要的是给
  • 克服 java.net.MalformedURLException: 无协议异常

    我有一个属性文件 其中包含一个属性 指定包含温度数据集的 NOAA 网站的 URL 该属性包含一个 DATE REPLACE 令牌 因为当 NOAA 生成新的预报时 URL 每天都会变化 在我的属性文件中 我指定 WEATHER DATA
  • 如何告诉 maven-shade-plugin 保留签名?

    我正在使用 maven shade plugin 将两个单独的 jar 组合成一个组合的 jar 其中一个罐子有签名 而另一个则没有 如果我使用插件的默认配置 它将构建一个损坏的 jar 因为新清单缺少签名所需的摘要 我可以通过排除签名文件
  • ASP.NET 图表控件无法在生产服务器上运行

    我有一个严重依赖图表的应用程序 目前图表可以在 ASP Net 开发服务器中工作 但是当我尝试发布到我的服务器 Win 2008 Server R2 IIS 7 时 图表不显示 使用 Firebug 我可以看到对 ChartImg axd
  • 识别解析实例的依赖关系 - IoC (autofac)

    有没有办法确定哪个调用者 依赖项正在解析它所依赖的实例 这就是我的想法 public class A public A Console Write I am being resolved by 0 public class B public
  • Javascript 是一个合适的密码学平台吗?或者说,可以吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Webhooks 可以与 GitHub OAuth 应用程序一起使用吗?

    所以我一直在阅读 GitHub 开发人员文档 关于 webhooks 他们有以下声明 Webhooks 允许您构建或设置订阅 GitHub com 上某些事件的 GitHub 应用程序 当这些事件之一被触发时 我们将向 Webhook 的配
  • 在谷歌电子表格中将单元格格式设置为分钟:秒

    我希望记录我完成某个编程问题所需的时间数据 我正在使用谷歌电子表格来保持我的表现 面临的问题是 我希望细胞接受结果mm ss 但谷歌表正在将其转换为12 hr格式即hh mm ss 我怎样才能阻止这种情况发生 例如 1 30被转换为凌晨 1
  • GO存储数据返回EOF

    我是 golang 新手 我正在尝试构建 Rest api 到目前为止 GET 端点对我来说工作得很好 但是我在使用 POST 方法 创建用户 时遇到了困难 这就是我的 User 结构的样子 type User struct ID uint
  • 处理失败的期货

    在 Play Framework 2 3 中 操作可以从成功的未来调用中产生结果 如下所示 def index Action async val futureInt scala concurrent Future intensiveComp
  • XPath 如何以名称空间不知道的方式识别谓词中的属性[重复]

    这个问题在这里已经有答案了 我有以下 XML 文件
  • 为数据库中的日期添加 30 天

    我在数据库中发布了更新日期和发布日期 目前它们的日期相同 我如何更改它 在 mysql 插入期间 以便发布日期比发布更新日期晚 30 天 我正在使用 pubDate Thanks 您可以使用日期添加 http dev mysql com d
  • PM2 Flush 不清除日志

    我运行的 Ubuntu 服务器突然满了 因为 pm2 日志占用了 16GB 我试过pm2 flush 但这只会清除占用 4GB 的文件夹 作为 root pm2 文件夹被清除 但日志文件夹未被清除 作为我自己的用户 该文件夹已被清除 但用户
  • 在Python中如何将`email.message.Message`对象转换为`email.message.EmailMessage`对象

    据我了解mboxPython 3 6 标准库中的类生成以下类型的旧式消息对象email message Message 较新的班级email message EmailMessage3 4 3 6 中引入的功能可以更轻松地访问消息内容 通过
  • 禁用 nginx 中的请求缓冲

    看起来 nginx 在将请求传递到上游服务器之前会缓冲请求 虽然对我来说大多数情况下都可以 但这是非常糟糕的 我的情况是这样的 我有 nginx 作为前端服务器来代理 3 个不同的服务器 apache 与典型的 php 应用程序 我用 py
  • lambda函数使用其参数作为模板参数调用模板函数

    以下是示例代码 无法编译 We use 迭代函数来迭代某个范围并运行 lambda 回调函数 这iterate函数将传递一些指示 即type 到回调 lambda 函数 然后该函数将根据指示进行工作 由于这些指示在编译时是固定的 我相信有一