如何创建不可复制对象的元组

2023-12-05

我正在尝试创建一个不可复制对象的元组。当我有了复制构造函数时,我就可以构造元组。当它们被删除时,编译将失败。

#include <tuple>
#include <iostream>
#include <utility>

struct A {
    int& x;
    int& y;

    A(int& a, int& b) : x(a), y(b) {}
    A(const A&) = delete;
    A& operator=(const A&) = delete;
};

class B {
public:
    B(int& w, int& x, int& y, int& z)
    : a_b_{ A(w,x),A(y,z)} {}
    
private:
    std::tuple<A, A> a_b_;
};

int main() {
    int w =1, x=2, y=3, z=4;
    B b{w,x,y,z};
    return 0;
}

我可以通过添加元组构造函数来使其工作。

struct A {
    int& x;
    int& y;

    A(int& a, int& b) : x(a), y(b) {}
    A(const A&) = delete;
    A& operator=(const A&) = delete;

    
    template<typename ...Args>
    A(const std::tuple<Args...> &args)
        : A(args, std::index_sequence_for<Args...>{}) {}

    template<typename ...Args, std::size_t ...Is>
    A(const std::tuple<Args...> &args, std::index_sequence<Is...>)
        : A(std::get<Is>(args)...) {}


};

class B {
public:
    B(int& w, int& x, int& y, int& z)
    : a_b_{ std::forward_as_tuple(w,x), std::forward_as_tuple(y,z)} {}
    
private:
    std::tuple<A, A> a_b_;
};

这并不理想,因为它需要将此构造函数添加到我的所有类中。有没有不需要改变元组中的对象的解决方案?谢谢!


C++17中有一种方法。在 C++11/14 中不起作用,因为在 C++17 中强制要求 RVO。

需要中级课程C用于构造A。在 C++17 的早期版本中,您必须添加一个额外的构造函数A.

#include <tuple>
#include <iostream>
#include <utility>

struct A {
    int& x;
    int& y;

    A(int& a, int& b) : x(a), y(b) {}
    A(const A&) = delete;
    A& operator=(const A&) = delete;
};

struct C {
    int* x;
    int* y;
    
    C(int& a, int& b) : x(&a), y(&b) {};
    
    operator A () const
    {
        return A(*x,*y);
    }
};

class B {
public:
    B(int& w, int& x, int& y, int& z)
    : a_b_{ C{w,x}, C{y,z}} {}
    
private:
    std::tuple<A, A> a_b_;
};

int main() {
    int w =1, x=2, y=3, z=4;
    B b{w,x,y,z};
    return 0;
}

如果你要使用std::pair代替std::tuple,你也可以通过以下方式实现它std::piecewise_construct. See,

#include <tuple>
#include <iostream>
#include <utility>

struct A {
    int& x;
    int& y;

    A(int& a, int& b) : x(a), y(b) {}
    A(const A&) = delete;
    A& operator=(const A&) = delete;
};


class B {
private:
    std::pair<A, A> a_b_;
public:
    B(int& w, int& x, int& y, int& z)
    : a_b_{std::piecewise_construct, std::forward_as_tuple(w,x),  std::forward_as_tuple(y,z)} {}
};

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

如何创建不可复制对象的元组 的相关文章

随机推荐

  • 是否可以将全局第三方类扩展为 Next.js 中的 CSS 模块?

    我正在使用 Next js 和 CSS 模块 现在在 app js我正在导入一个全局 scss 文件 如下所示 import public scss style scss 在这个文件中 我导入了 Bootstrap import node
  • 在 gridview 中冻结标题时正确设置标题宽度和列

    我想要一个带有固定 header 的 gridview 我试过这个link and this 我一直都能做到这一点 但存在网格标题宽度和列宽度设置不相等的问题 所以它看起来不太好 但滚动和冻结确实可以正常工作 如果我不使用冻结逻辑 则标题宽
  • Javascript 事件在平板电脑上不起作用?

    我在 ASP NET 3 5 中开发了一个 Web 应用程序 它消耗了大量的 javascript JQuery 事件 并且在 PC 的普通浏览器中正常工作 但我的客户说这些在tablet pc android 和 iPad 中不起作用 就
  • Jquery Mobile:多次更新表单

    好的 经过几个小时的困惑 我发现在 Jquery Mobile 元素上调用 page 只能工作一次 如果我想通过 AJAX 多次更新表单 该怎么办 update jQuery Mobile beta2 引入了create event tri
  • 如何模拟 do-while 循环?

    我需要在 Python 程序中模拟 do while 循环 不幸的是 下面的简单代码不起作用 list of ints 1 2 3 iterator list of ints iter element None while True if
  • 如何引用Microsoft.Office.Interop.Excel dll?

    我在 2006 年使用 MS VS 2005 开发了一个处理 Excel 表格的系统 现在 我无法在 MS VS 2012 中使用相同的参考 var app new Microsoft Office Interop Excel Applic
  • SQL删除清除表而不是出错

    我有一段 SQL 你会认为 无法编译 但它会从目标表中删除所有行 考虑这个设置 create table TableA ColumnA varchar 200 create table TableB ColumnB varchar 200
  • 如何创建复选框列表

    我正在尝试读取 xml 文件并填充QListWidget及其一些内容 每个条目都应该有一个复选框 在 Qt Designer 中 我创建了列表并添加了一个具有复选框的项目 方法是将项目添加到 listWidget 然后右键单击它并选择 编辑
  • SceneKit – 加载 HDR 或 EXR 光照环境没有效果

    我尝试加载 hdr文件以将其用作天空盒并使用其照明信息 这是我使用的代码 backgroundColor UIColor gray check if a default skybox is added let environment UII
  • 以编程方式删除 Lotus Notes 设计元素继承

    作为创建基本修订控制系统的一部分 我想以编程方式禁用 Lotus Notes 模板上的设计元素级别继承 到目前为止我已经尝试过以下方法 DXL 导出 ForceNoteFormat true XSLT 由于导入器中字段 上的验证问题而失败
  • 通过chrome扩展获取下载文件的绝对路径

    我正在开发一个 chrome 扩展 它可以从网页下载特定文件 我有一个 popup html 通过它我可以输入要下载的文件的名称 还有一个链接 历史记录 单击该链接我想打开一个新页面 其中包含指向以前下载的文件的链接 下载历史记录 我可以下
  • PHP 致命错误:在非对象上调用成员函数 Execute() [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 当我执行此代码时 出现错误 PHP 致命错误 在非对象
  • 如何在 Scene Kit 中对同一场景使用多个摄像机

    我有 2 个彼此相邻的 SCNView 两者都应该显示相同的场景 但通过不同的摄像机 在我看来 场景套件使用该节点和节点层次结构中最高的相机 所以我尝试了类似的方法 leftSceneView scene rootNode addChild
  • 哪里可以下载 MotoDev Studio? [关闭]

    Closed 这个问题是无关 目前不接受答案 在新的摩托罗拉网站中 我找不到任何 MotoDev Studio 的链接 我去年用过 现在好像消失了 你知道我在哪里可以找到最后的版本吗 他们不再支持 MotoDev 工作室 这与收购Googl
  • Swift:如何使用 PREPROCESSOR Flags(如 `#if DEBUG`)来实现 API 密钥?

    In Objective C有时使用静态字符串常量定义备用 API 键很有用 例如 区分分析包的 RELEASE 和 DEBUG 键 如 MixPanel Flurry 或 Crashlytics if DEBUG static NSStr
  • laravel 在本地计算机上返回 json 字符串,但在 elastic beanstalk 实例上返回整数

    我在使用 aws mysql laravel 和 Angular 时遇到一个奇怪的问题 我有一个本地运行的 vagrant 实例 上面运行着我的应用程序和数据库 我在前端使用 Angular 因此当加载视图时 Angular 会请求接收用户
  • 您能解释一下这个嵌入式 MATLAB 函数错误吗?

    我在将值从 GUI 发送到 Simulink 模型中的嵌入式 MATLAB 函数 EMF 时遇到问题 我从 GUI 中的滑块获取该值 并将其发送到模型中的 EMF 块 我可以确认该值已从 GUI 正确传输到 Simulink 模块 因为我可
  • 在 Access 中为最终用户创建动态“复选框”查询

    用例场景 我有一个低收入居民的客户 这些居民可以填写带有一堆复选框的纸质表格 它有一个 教育 部分 GED 文凭 助理等 另一部分为 技能 暖通空调 管道等 雇主联系我的客户 例如要求他们所有接受过 HVAC 培训的居民都拥有 GED 现在
  • Varnish + nginx + ELB 499 响应

    我有 varnish 4 服务器使用 nginx 作为连接到 ELB 的反向代理 每隔 2 天左右 我的服务器就会停止响应 我会在 nginx access log 中看到 499 个响应 重启nginx即可解决问题 为什么我开始收到这些
  • 如何创建不可复制对象的元组

    我正在尝试创建一个不可复制对象的元组 当我有了复制构造函数时 我就可以构造元组 当它们被删除时 编译将失败 include