如何将这段 javascript 代码重写为 C++11?

2024-05-11

这是我在 Javascript Definitive Guide 中看到的 javascript 闭包代码。我想把它写成C++11

var uniqueID1 = (function()
{
    var id = 0;
    return function() { return id++; };
})();    

这是我写的cpp代码。但它没有被编译。 C++11可以表示相同的表达式吗?

auto c = []() -> int (*)() { int x = 0; return [&x]() -> int { return x++; }};

我用的是VS2010

Edit:这是我制作的完整 JavaScript 示例代码。您可以轻松测试代码在网络浏览器中的工作方式。

<head>
<script language="javascript">
var uniqueID1 = (function()
{
    var id = 0;
    return function() { return id++; };
})();

var uniqueID2 = (function()
{
      var id = 0;
      return function() { return id++; };
})();
</script>
</head>

<body>
        <input value = "uniqueid1" type="button" OnClick="alert(uniqueID1());"></input>
        <input value = "uniqueid2" type="button" OnClick="alert(uniqueID2());"></input>
</body>
</html>

好的,首先让我们分解一下 JavaScript 的作用。

function()
{
    var id = 0;
    return function() { return id++; };
}

这创建了一个函数。没有名称、不带参数的函数。调用该函数时,将返回一个新函数。内部函数将有权访问本地范围的变量,并且该变量将是该内部函数状态的一部分。

每次调用该函数时,都会返回一个new功能。该新函数将有自己的状态(var id = 0;毕竟,必须做点什么)。外部函数的每次调用都会返回一个具有新状态的新函数。

This:

(function()
{
    var id = 0;
    return function() { return id++; };
})

将函数括在一对括号中。这是运算符优先级规则所必需的,以使其发挥作用:

(function()
{
    var id = 0;
    return function() { return id++; };
})()

这创建了一个函数,然后calls功能。这就是最后的事()做在最后。它调用外部函数,该函数创建一个具有自己作用域的内部函数并返回它。

在这个表达式中,外部函数is lost。它消失了;您无法再访问它。您创建它的时间刚好足以调用它,然后让它掉进垃圾收集的垃圾桶。

考虑到所有这些,我们可以看到这样的声明:

var uniqueID1 = (function()
{
    var id = 0;
    return function() { return id++; };
})();

创建外部函数,调用返回新函数的函数,然后存储inner变量中的函数称为uniqueID1.

如果您需要证明这是真的,请在 HTML 中尝试以下操作:

var uniqueMaker = function()
{
    var id = 0;
    return function() { return id++; };
};

var uniqueID1 = uniqueMaker();
var uniqueID2 = uniqueMaker();

您将得到与复制粘贴版本相同的答案。

如果我们希望 C++ 代码模仿这一点,我们需要使用正确的 C++ 代码执行每个步骤。

首先,内部功能。在 C++ 中,不存在词法作用域。因此,您不能返回引用其他作用域中的变量的函数。您只能返回一个具有copy来自另一个作用域的变量。此外,除非您明确允许,否则 lambda 无法修改作用域。因此,内部代码必须如下所示:

int id = 0;
return [=]() mutable { return ++id; };

一切都很好,但现在我们需要创建一个 lambda 来返回这个有状态 lambda 函数。在 C++ 中,有状态的函数与函数指针不同。由于 lambda 的类型是编译器定义的,因此无法键入其名称。因此,我们必须雇用std::function作为外部函数的返回类型。

[]() -> std::function<int()>
{
  int x = 0;
  return [=]() mutable { return x++; };
}

这将创建一个 lambda 函数,该函数在被调用时将返回一个具有自己状态的内部函数。独立于对此函数的任何后续调用的状态。就像 JavaScript 示例一样。

现在,这还不够。请记住,您的 JavaScript 创建外部函数、调用它并存储only它的返回值。外层函数itself被丢弃。所以我们需要模仿这个。幸运的是,这在 C++ 中很容易;它看起来就像 JavaScript:

([]() -> std::function<int()>
{
  int x = 0;
  return [=]() mutable { return x++; };
})()

最后,我们把它放在一个变量中:

auto uniqueID1 = ([]() -> std::function<int()>
{
  int x = 0;
  return [=]() mutable { return x++; };
})();

的类型uniqueID1std::function<int()>。它不会是外部函数的类型。外部函数只是一个临时函数,用于创建内部作用域。

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

如何将这段 javascript 代码重写为 C++11? 的相关文章

  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • 如何使用tampermonkey模拟react应用程序中的点击?

    我正在尝试使用 Tampermonkey 脚本模拟对 React 元素的点击 不幸的是 由于 React 有自己的影子 DOM 所以天真的方法使用document querySelector 不工作 我遇到了一些需要修改 React 组件本
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 如何获取给定 DOM 元素的所有定义的 CSS 选择器?

    如何使用 jQuery 获取给定 DOM 元素的所有定义的 CSS 选择器 定义后 我的意思是在应用于任何样式表的所有 CSS 选择器document 在某种程度上 这类似于 FireBug 实现的功能 其中显示所选 DOM 元素的所有应用
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 使用 C# 读取 Soap 消息

  • 在 React.js 中编辑丰富的数据结构

    我正在尝试为数据结构创建一个简单的基于网格的编辑器 但我在使用 React js 时遇到了一些概念问题 他们的文档对此没有太大帮助 所以我希望这里有人可以提供帮助 首先 将状态从外部组件传输到内部组件的正确方法是什么 是否有可能将内部组件中
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • fullCalendar 未显示正确的结束日期

    我正在看调试页面 http jsbin com wukofacaxu edit js outputFullCalendar 官方网站的 我想安排一个活动时间为 22 09 2015 至 30 09 2015 dd mm yyyy 但它只显示
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • 如何将现有对象实例包装到 DispatchProxy 中?

    我在找RealProxy NET Core 中的替换 以及这个issue https github com dotnet corefx issues 4091将我转发至DispatchProxy https www nuget org pa
  • 带参数的 MySQL 脚本

    我想创建一个部署脚本 以某种方式模拟 Oracle 部署脚本 其中使用 param 您可以使用之前声明的参数 我需要为不同数据库上的不同用户自动调用此脚本 例如我的脚本应该是 USE param DROP TABLE IF EXISTS T
  • 为通用字符选择表排序规则

    我正在开发一个需要存储通用字符的后端 我选择了utf8mb4用于此目的的表编码 我还必须选择表格排序规则 最直接的选择是选择utf8mb4 general ci表整理 除了一般的排序规则之外 还有大约20种其他排序规则可供选择 更具体的排序
  • 如何避免内存不足异常

    在我的应用程序中 我使用图像的 url 从网络下载图像 我有很多图像 因此我为此实现了分页技术 并按垂直顺序为每页显示 15 个图像 在这种情况下 我向上 向下滚动页面以查看图像 此时我的应用程序崩溃了 并且出现了内存不足异常 请任何人帮助
  • 无法使用前导 ../ 在顶级目录之上退出

    我有一个 asp net 网站 我们有管理区域 其中的登录页面仅供管理员使用 并且所有网站都允许所有人使用 当我收到此错误时 我需要询问如何为其定义正确的安全配置 Cannot use a leading to exit above the
  • 如何删除前一个(或第n个)标签?

    我正在尝试实施一个这个问题的答案 https stackoverflow com a 73437787 2229856 但不知何故没有显示标签 也没有显示任何错误消息 在此代码之外 所有标签都会显示 因此label new 实例本身运行良好
  • 自动递增 EC2 实例名称

    我在 Stackoverflow 上看到很多问题 询问是否有办法自动递增实例名称 例如 foo1 foo2 fooN 我想看看是否有办法在 Powershell 中执行此操作 我正在使用 AutoLaunchConfiguration AS
  • ValueError:维度 (-1) 必须在 [0, 2) 范围内

    我的python版本是3 5 2 我已经安装了keras和tensorflow 并尝试了官方的一些示例 示例链接 示例标题 用于多类 softmax 分类的多层感知器 MLP https keras io getting started s
  • 未调用 C++ 重写函数

    我遇到了一个问题 即未调用重载函数 而是调用了基函数 我怀疑这与项目文件之间的划分方式有关 在文件 obj1 h obj1 cpp 中我有这样的东西 class obj1 public void print void obj1 print
  • 如何以编程方式将访问键(快捷方式)添加到 WPF ContextMenu?

    我已经有以下内容 var myContextMenu new System Windows Controls ContextMenu var exitItem new MenuItem exitItem Header E xit exitI
  • 免费商店的“堆”一词的由来是什么?

    我试图找到免费存储通常被称为堆的官方 或足够好的 原因 除了它从数据段末尾增长这一事实之外 我实在想不出一个很好的理由 特别是因为它与堆数据结构关系不大 注意 很多人提到这只是一大堆没有组织的东西 但对我来说 堆 一词在物理上意味着一堆物理
  • 使用本地化故事板进行即时本地化

    我正在开发一个应用程序 它有一个切换按钮可以在英语和阿拉伯语之间切换 并且应该是动态的 我正在使用该方法https github com maximbilan ios language manager https github com ma
  • 如何查看 Postman Collection Runner 中的回复?

    我正在使用 Postman Collection Runner 使用迭代多次运行相同的请求 我的测试按预期工作 但我无法看到每个请求的单独响应 是否可以在 Postman Collection Runner 中查看请求的响应 在最新版本的
  • 将 Spring ModelAttribute 应用于所有使用特定参数类型的控制器

    在 Spring Boot REST 应用程序中 我有一个TableRequest包含表格数据 GET 请求的列排序 筛选和分页详细信息的类型 它是通用的 因为它不关心所请求的具体数据是什么 它只指定通用表参数 因此它适用于许多不同的控制器
  • 如何将嵌入的 ICC 配置文件信息转储为 PDF? (命令行或 GUI 工具)

    它在那里命令行或 GUI 工具转储有关 ICC 配置文件 颜色转换的信息 这些信息是在 Illustrator 的 PDF 导出对话框中设置的 PDF 的颜色管理和 PDF X 选项 选项 Illustrator 的 PDF 颜色管理和 P
  • 如何使用google AI平台在线预测?

    我创建了一个自定义张量流模型并部署到谷歌云人工智能平台 但是 当我向在线预测 API 发送发布请求时 https ml googleapis com v1 projects my project models my model versio
  • Asp 按钮悬停和 CSS

    我有一个 asp 按钮控件 我在上面应用了一些样式 我希望鼠标悬停在该按钮上时 按钮的颜色应该发生变化或类似的情况 但我不明白为什么在 CSS 中按钮悬停功能不起作用 请帮忙 另请让我知道按钮悬停的最佳效果是什么
  • 显示多个表的账户余额

    我有以下两个表 其中存储有关贷记和借记记录的信息 couponCr 表包含 voucherType voucherPrefix voucherNo crparty cramount SALES S 1 1 43000 SALES S 2 1
  • 如何在C++中生成非常大的随机数

    我想使用 C 生成 0 2 64 范围内的非常大的随机数 我已经使用了 rand 函数 但它没有生成非常大的数字 有人可以帮忙吗 使用c 11 使用标准c 11的随机库 http en cppreference com w cpp nume
  • 如何将这段 javascript 代码重写为 C++11?

    这是我在 Javascript Definitive Guide 中看到的 javascript 闭包代码 我想把它写成C 11 var uniqueID1 function var id 0 return function return