如何存储通用引用

2024-03-02

我需要在类中存储通用引用(我确信引用的值将比类的寿命更长)。有这样做的规范方法吗?

这是我想出的一个最小的例子。它似乎有效,但我不确定我是否做对了。

template <typename F, typename X>
struct binder
{
    template <typename G, typename Y>
    binder(G&& g, Y&& y) : f(std::forward<G>(g)), x(std::forward<Y>(y)) {}

    void operator()() { f(std::forward<X>(x)); }

    F&& f;
    X&& x;
};

template <typename F, typename X>
binder<F&&, X&&> bind(F&& f, X&& x)
{
    return binder<F&&, X&&>(std::forward<F>(f), std::forward<X>(x));
}

void test()
{
    int i = 1;
    const int j = 2;
    auto f = [](int){};

    bind(f, i)();   // X&& is int&
    bind(f, j)();   // X&& is const int&
    bind(f, 3)();   // X&& is int&&
}

我的推理正确还是会导致微妙的错误?另外,是否有更好(即更简洁)的构造函数编写方法?binder(F&& f, X&& x)不起作用,因为这些是右值引用,因此不允许binder(f, i).


您不能“存储通用引用”,因为不存在这样的东西,只有右值引用和左值引用。 “通用参考”是 Scott Meyers 用来描述语法特征的方便术语,但它不是类型系统的一部分.

具体查看代码细节:

template <typename F, typename X>
binder<F&&, X&&> bind(F&& f, X&& x)

在这里你正在实例化binder使用引用类型作为模板参数,因此在类定义中无需将成员声明为右值引用,因为它们已经are引用类型(左值或右值,由bind)。这意味着您始终拥有更多&&令牌比需要的多,这些令牌是多余的,并且由于引用崩溃而消失。

如果你确定binder总是会被你实例化bind函数(因此总是用引用类型实例化),那么你可以这样定义它:

template <typename F, typename X>
struct binder
{
    binder(F g, X y) : f(std::forward<F>(g)), x(std::forward<X>(y)) {}

    void operator()() { f(std::forward<X>(x)); }

    F f;
    X x;
};

在此版本中的类型F and X是引用类型,所以使用是多余的F&& and X&&因为它们要么已经是左值引用(所以&&什么都不做)或者它们是右值引用(所以&&在这种情况下也什么也不做!)

或者,你可以保留binder当你拥有它并改变它时bind to:

template <typename F, typename X>
binder<F, X> bind(F&& f, X&& x)
{
    return binder<F, X>(std::forward<F>(f), std::forward<X>(x));
}

现在你实例化binder具有左值引用类型或对象(即非引用)类型,然后在内部binder您通过附加声明成员&&所以它们要么是左值引用类型,要么是右值引用类型。

此外,如果您考虑一下,您不需要存储右值引用成员。通过左值引用存储对象是完全可以的,重要的是你forward它们正确地作为左值或右值operator()功能。所以班级成员可能只是F& and X&(或者在您总是使用引用参数实例化类型的情况下,F and X)

所以我将代码简化为:

template <typename F, typename X>
struct binder
{
    binder(F& g, X& y) : f(g), x(y) { }

    void operator()() { f(std::forward<X>(x)); }

    F& f;
    X& x;
};

template <typename F, typename X>
binder<F, X> bind(F&& f, X&& x)
{
    return binder<F, X>(f, x);
}

此版本保留了模板参数中所需的类型F and X并在中使用正确的类型std::forward<X>(x)表达式,这是唯一需要它的地方。

最后,我发现根据推导类型进行思考更准确,更有帮助,而不仅仅是(折叠的)引用类型:

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

如何存储通用引用 的相关文章

  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • 格式说明符%02x

    我有一个简单的程序 include
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • VanillaJS 到 VueJS 错误:Flickity 的错误元素:轮播

    我想得到这个轻快的例子 https codepen io desandro pen RNQgpB CodePen 在 VueJS 组件中工作 HTML div class carousel div class carousel cell d
  • Laravel ORM从自引用表获取N级层次结构JSON

    我在用LARAVEL 4 with MySQL后端 我有一个self referencing带列的表id name type and parent Here parent is foreign key列的Id 表中数据如下 id name
  • 使用 Angular-CLI 安装第 3 方应用程序

    我是 angular cli 的新手 我想安装 npm 库 mdbootstrap 我按照这里的说明进行操作 Angular CLI 说明 https github com angular angular cli global librar
  • WebStorm错误:表达式语句不是赋值或调用

    我正在使用 WebStorm 但收到一个我无法理解的错误 Node js MongoDB var mongoose require mongoose mongoose Promise global Promise mongoose conn
  • 正确检查 nil sqlite 文本列

    我有一个分配给字符串的 sqlite 字符串列 我需要在分配之前确保它不为零 我正在这样做 char isNil sqlite3 column text selectstmt 2 if isNil nil myName NSString s
  • OS X Byobu 垂直分割

    我目前在 OS X 上使用 iTerm2 和 byobu 但我不知道如何在 OS X 上垂直分割屏幕 在 Linux 上 我可以使用 Ctrl F2 垂直分割屏幕 但在 OSX 上则不行 不行 这要归功于苹果的不同键盘 我用谷歌搜索了所有解
  • java 缓冲图像:检测黑色像素

    我有这个简单的代码来浏览 24 位彩色 Windows bmp 文件 BufferedImage mapa BMPDecoder read new File maps map bmp final int xmin mapa getMinX
  • 什么时候会发生下溢?

    我陷入了计算的情况1 77e 308 10触发下溢异常 但计算1 777e 308 10才不是 这很奇怪 因为 当浮点的真实结果发生下溢 操作的幅度小于 即接近于零 可表示为普通浮点数的最小值 目标数据类型 来自算术下溢 维基百科 换句话说
  • 三.js透明物体遮挡

    在 Three js 场景中 我希望有一个不可见的对象 但仍然遮挡场景中的其他对象 就好像它是可见的一样 这可以通过 Three js 库实现吗 这是一个例子 Suppose I have a three js scene that con
  • 在elasticsearch实例上打开开放的GCE防火墙以进行外部连接

    我刚刚使用 Click to Deploy 在 GCE 中创建了一个 elasticsearch 集群 但我只能使用隧道来访问它 就我而言 这不是一个选择 因为我不想向其他开发人员授予 gcloud 访问权限 我想为elasticsearc
  • 访问生成 T-SQL 中的 ROW_NUMBER() 等结果的查询

    MS Access 中有 ROW NUMBER 函数吗 如果有 请让我知道它的任何语法 因为我被困在这里 我尝试过论坛 但我得到了 sql server 语法 以下是我的查询 select ROW NUMBER OVER ORDER BY
  • OnClickListener 不适用于 GridView 中的第一项

    我在创建基于 GridView 的日历时遇到问题 这是网格 这应该是一个填充了事件的日历 因此我让我的适配器实现 OnClickListener 并为日历中的每个按钮设置该侦听器 它适用于每个按钮EXCEPT第一个 在本例中为 30 当我单
  • Java Web 应用程序“过期会话的事件监听器”

    有没有办法在运行Java代码之后HttpServletRequest Session已到期 如果会话过期 我需要进行数据库调用 回调和监听器将是有用的 javax servlet http HttpSessionListener The 雅
  • 包含修订历史记录的 CouchDB 视图

    我对 CouchDB 很陌生 已经缺少 SQL 了 无论如何 我需要创建一个视图来发出文档的一些属性以及所有修订 ID 像这样的东西 function doc if doc type template emit doc owner id d
  • VS Xaml 设计器错误

    我的 WPF 应用程序中的 Xaml 文件出现错误 我无法在 Visual Studio 设计器或 Blend 中看到我的控件 但是 该应用程序可以完美编译并运行 在 Blend 中 它说存在无效的 Xaml 并且该错误根本没有任何意义 但
  • 尝试将本地页面加载到 JavaFX webEngine 中

    我的 JavaFX 应用程序的选项卡上有一个 webView 组件 我正在尝试将本地存储的 HTML 页面加载到 WebView browser new WebView WebEngine webEngine browser getEngi
  • 监听附加端口 Microsoft Azure Nodejs

    我正在端口 process env PORT 1337 Microsoft Azure 上的默认端口 上运行 Nodejs 应用程序 Azure Web App 我还需要监听 websocket 的附加端口 在我本地 我使用的是 8000
  • 如何禁用 DateTimePicker 控件上的某些日期?

    如何禁用选定的日期DateTimePicker这样用户就无法选择它们 我知道这在 Web 窗体中是可能的 但在 Windows 窗体中我无法执行此操作 我怎样才能实现这个目标 您执行此操作的难易程度取决于您想要限制的日期 例如 如果您只想指
  • 如何从 Android 电话簿中选择联系号码到我的应用程序中?

    全部 我想从我的应用程序数据库中的android电话簿中获取号码 我已经用下面的代码尝试过 但这里正在获取人名 而不是我想要电话簿中的号码并希望将其存储在我的数据库中 如何实现这一目标 任何人都可以指导我 Override public v
  • 如何存储通用引用

    我需要在类中存储通用引用 我确信引用的值将比类的寿命更长 有这样做的规范方法吗 这是我想出的一个最小的例子 它似乎有效 但我不确定我是否做对了 template