如果要调用多个成员函数,对象编辑器是一个好方法吗?

2024-01-11

我经常对这样的类成员函数的顺序调用感到恼火(忽略新用法,它是针对 Qt 的,但它与 Qt 并不严格相关)

A a = new A();
a->fun1("one");
a->fun2(1, 2);
...
a->fun10("end");

我总觉得这样的代码应该写成简单的指令,而不是项目主线。

来自 Qt 的简单示例:

auto* spinBox = new QSpinBox();
spinBox->setRange(-100, 100);
spinBox->setValue(50);
spinBox->setSingleStep(5);
newLayout->addWidget(spinBox);

但我更愿意用简单的单行来完成此操作而不是那样。所以我写了这样的东西:

class {
public:
    template<class X>
    auto& operator()(X* ptr) {
        this->ptr = ptr;
        return *this;
    }

    template<class X, class R, class... Args>
    auto& operator()(R (X::* fun)(Args...), Args... args) {
        if(ptr == nullptr) {
            std::cerr << "Editor can't edit nullptr" << std::endl;
            return *this;
        }
        auto call = std::mem_fn(fun);
        call(*static_cast<X*>(ptr), args...);
        return *this;
    }

    template <class X>
    operator X*() {
        auto* result = static_cast<X*>(ptr);
        ptr = nullptr;
        return result;
    }
private:
    void *ptr = nullptr;
} EDITOR;

现在的用法:

newLayout->addWidget(EDITOR(new QSpinBox)(&QSpinBox::setRange,-100, 100)(&QSpinBox::setValue, 50)(&QSpinBox::setSingleStep, 5));

除了类型不安全之外,这是个好方法吗? (我可以忍受)

--- EDIT ---

另一种类型安全的方法是:

template<class X>
class EDITOR2 {
public:
    EDITOR2(X* ptr) {
        this->ptr = ptr;
    }

    template<class R, class... Args>
    auto& operator()(R (X::* fun)(Args...), Args&&... args) {
        if(ptr == nullptr) {
            std::cerr << "Editor can't edit nullptr";
            return *this;
        }
        auto call = std::mem_fn(fun);
        call(*ptr, args...);
        return *this;
    }

    operator X*() {
        return ptr;
    }

    X *ptr;
};

与用法:

newLayout->addWidget(EDITOR2<QSpinBox>(new QSpinBox)(&QSpinBox::setRange, -100, 100)(&QSpinBox::setValue, 50)(&QSpinBox::setSingleStep, 5));

但这需要每次重新创建编辑器对象,并添加额外的使用代码。


我们来战斗吧,

第一个对手,普通方法:

auto* spinBox = new QSpinBox();
spinBox->setRange(-100, 100);
spinBox->setValue(50);
spinBox->setSingleStep(5);
newLayout->addWidget(spinBox);
  • Pros:

    • 这是所有人都这样做的方式
    • 大约 30 列宽,可读性很好
  • Cons:

    • 需要5行
    • 动作的主题spinBox每次都会重复

第二个对手,奇特的方法:

newLayout->addWidget(EDITOR2<QSpinBox>(new QSpinBox)(&QSpinBox::setRange, -100, 100)(&QSpinBox::setValue, 50)(&QSpinBox::setSingleStep, 5));
  • Pros:

    • 需要一根线
    • 这是一种更函数式的编程方法
  • Cons:

    • 这是一个很长的行,很难阅读
    • 默认情况下,人们的反应会是以下的一种变体wtf因为他们不习惯
    • 实例名称spinBox不重复而是类名QSpinBox now is

最终的选择取决于你对每个点的重视程度,我确实比较了一行中的第二种方法,就好像你使用换行符一样,你基本上回到了你试图修复的原始问题

以我的拙见,增加这么少的类开销是不值得的,而且我是那种对原始方法的缺点感到恼火的人,致命点是可读性损失,这很可能会迫使你使用换行符反过来,这几乎意味着你所做的这一切都是徒劳的。

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

如果要调用多个成员函数,对象编辑器是一个好方法吗? 的相关文章

随机推荐

  • 猫头鹰旋转木马 2 响应式图像

    这个案例有一些题目 但是尝试了各种方法之后 没有成功 我试图在 owl carousel 2 插件中使图像响应 我使用responsive插件选项中的选项 我可以控制所需分辨率的项目数量 但在某些分辨率图像不适合父级高度 父级是view a
  • 任何时候只能打开一个 ContentDialog

    如果我多次按下登录按钮 则会触发消息 异步操作未正确启动 任何时候只能打开一个 ContentDialog 延迟代表应用程序联系服务器以查看用户是否有效所需的时间 如果我使用 MessageDialog 一切正常 但我想使用 Content
  • 数字总和返回 NaN

    我正在尝试对 div 内的数字求和 所以 我这样做了 document ready function var numbers sumNumbers item each function numbers this children text
  • 将对象列表发布到 MVC 5 控制器

    我想将对象列表发布到 MVC 5 控制器 但只有 NULL 到达控制器方法 这个帖子 ajax type POST dataType json contentType application json url delikte data JS
  • 使用 postgresql 时出现错误“无法写入临时文件块....设备上没有剩余空间...”

    我正在运行一个非常大的查询 在表中插入很多行 近 800 万行划分为一些较小的查询 但在某些时刻出现错误 我收到错误 无法写入块 临时文件的设备上没有剩余空间 使用 postgresql 我不知道每次查询后是否需要删除临时文件以及如何执行此
  • 分段错误 chkstk_ms C++

    我需要有关以下计数排序实现的帮助 是不是因为x的值太大了 我遇到分段错误 gdb 是这样说的 Program received signal SIGSEGV Segmentation fault chkstk ms at usr src d
  • jquery 自动完成列表不与父输入元素粘在一起

    我在使 jqueryUI 自动完成适应我网站的 CSS 布局时遇到一些困难 每当我在输入字段上调用自动完成功能时 列表都会按预期打开 由于输入位于固定高度的 div 内 因此当用户滚动该 div 时 自动完成列表保持固定 有没有人遇到过这种
  • Word VBA:获取连续标题之间的范围

    我查了一些例子 但我不太明白 Range 对象是如何工作的 我试图循环遍历每个标题 第 4 级 并使用一个嵌套循环来遍历标题之间的所有表格 我不知道如何设置该特定范围 因此任何帮助将不胜感激 Dim myHeadings As Varian
  • PATCH/PUT 不接受多部分/表单数据文件上传?

    知道为什么 PATCH 和 PUT 不接受多部分 表单数据文件上传吗 当我跑步时var dump FILES 它输出array 0 有什么想法为什么会发生这种情况吗 如果我发布文件 它工作正常 以下是我正在运行的请求的示例 提前致谢 PUT
  • Django 项目中的迁移目录是否应该推送到 git 存储库?

    在 Django 项目中 当模型更改时 迁移文件也会更改 如果我将迁移目录添加到 git 这会引起其他人的冲突 如果我不添加它 有时在迁移时会引发服务器错误 你怎么解决这个问题 来自姜戈迁移文档 https docs djangoproje
  • 使用 Retrofit Android 进行相互身份验证

    I need to send a CRT and KEY file on an api request I managed to do the request using Postman but I don t know how to pa
  • Instagram API:身份验证期间强制提​​示

    有没有办法让 Instagram auth login 始终要求身份验证 当用户登录并且已经授权该应用程序时 此操作将被跳过 这就像推特的use authorize true或谷歌的approval prompt force 我相信最简单的
  • Android 使用 OnClick 从 SD 卡删除图像

    我试图简单地从一个简单的应用程序中删除图像 我有它 当您单击图像时 它会弹出一个对话框 其中包含删除它的选项 我以为这只是简单的事情 但我一直在尝试的一切似乎都没有起到任何作用 下面是我的代码 任何想法将不胜感激 delete setOnC
  • 具有多个数据库供应商支持的 Java/Maven/JPA/Hibernate 构建的最佳方法?

    我有一个使用单个数据库的企业应用程序 但该应用程序需要支持mysql oracle and sql 服务器作为安装选项 尝试保持便携我们正在使用JPA注释 with 休眠作为实施 我们还为每个正在运行的开发数据库提供了一个测试台实例 该应用
  • 在 Rcpp(Eigen) 中在 NumericVector/Matrix 和 VectorXd/MatrixXd 之间进行转换以执行 Cholesky 求解

    Edit 根据下面德克的回答的一些线索 我解决了这个问题 现在解决了问题的正文 我确信这必须记录在某处 但我的谷歌技能让我失望 我正在开发一个 Rcpp 包 我认为我不需要 依赖于特征 所以我使用NumericVector Matrix相当
  • Windsor可以与其他IoC容器合作吗?

    在我们应用程序的核心中 我们使用 Castle Windsor 来管理我们的依赖项 我们将从第三方加载插件 这些插件可能使用他们自己的 IoC 容器 我们希望它们能够从核心接收依赖项 例如通过构造函数注入核心的服务 还可以从自己的 IoC
  • Jenkins CORS Filter 插件未添加 Access-Control-Allow-Origins 标头

    我正在尝试向我的 Jenkins 服务器添加 CORS 支持 以便我可以从浏览器访问 REST API 环顾四周 推荐的方法是使用CORS 过滤器插件 https github com jenkinsci cors filter plugi
  • 如何在 XAML ListBox 中使用多重绑定?

    下面显示了列表框中的 3x MultiTest Model Customers 它应显示的每条记录一个 我需要改变什么才能让它输出contents代替字段
  • underlineColorAndroid 无法在 android 中工作

    react native cli 2 0 1 react native 0 52 2 在我的 ios 设备中 表单看起来不错 但在 Android 设备中 它在 TextInput 上显示底部边框 class Input extends C
  • 如果要调用多个成员函数,对象编辑器是一个好方法吗?

    我经常对这样的类成员函数的顺序调用感到恼火 忽略新用法 它是针对 Qt 的 但它与 Qt 并不严格相关 A a new A a gt fun1 one a gt fun2 1 2 a gt fun10 end 我总觉得这样的代码应该写成简单