将相同的运算符专门用于不同的特征

2024-03-17

我想通过特征进行专业化来执行以下操作。

  1. Array Aa = Scalar in_a会使用overload I.

  2. Array Aa = Array Bb会使用overload II.

在下面的代码中,overload II永远不会习惯。

有人提到过T1不能推导出overload II.

如何解决这个问题?

我使用 C++ shell 用 C++14 编译代码。

#include <iostream>
#include <type_traits>

using namespace std;
class A; // forward declaration.

template <typename T>
struct is_A : false_type {};
template <> struct is_A<A> : true_type {};

template <typename T>
struct is_int : false_type {};
template <> struct is_int<int> : true_type {};
template <> struct is_int<long> : true_type {};

class A{
    public:
        int val;
        void print(void){
            std::cout << val << std::endl;
        }
        template <typename T1>
        enable_if_t<is_int<T1>::value,void>
        operator=(const T1 & input){
            val = 2*input; //Overload I
        }
        template <typename T1>
        enable_if_t<is_A<T1>::value,void>
        operator=(const T1 & Bb){
            val = 5*Bb.val; //Overload II
        }
};

int main(void){
    A Aa;
    A Bb;
    int in_a = 3;
    Aa = in_a; //This uses overload I as intended.
    Bb = Aa; //I want this to use overload II, but
             //actually overload I is used.
             //This leads to an error during compilation.
    Aa.print(); //This should give 6. (3x2)
    Bb.print(); //This should give 30. (6x5)
}

这是您的代码简化并按预期工作:

#include <iostream>
#include <type_traits>
#include<utility>

class A;

template <typename T>
struct is_A : std::false_type {};
template <> struct is_A<A> : std::true_type {};

template <typename T>
struct is_int : std::false_type {};
template <> struct is_int<int> : std::true_type {};
template <> struct is_int<long> : std::true_type {};

class A{
public:
    int val;

    void print(void){
        std::cout << val << std::endl;
    }

    template <typename T1>
    std::enable_if_t<is_int<std::decay_t<T1>>::value, void>
    operator=(T1 && input){
        val = 2*std::forward<T1>(input);
    }

    template <typename T1>
    std::enable_if_t<is_A<std::decay_t<T1>>::value,void>
    operator=(T1 && Bb){
        val = 5*std::forward<T1>(Bb).val;
    }
};

int main(void){
    A Aa;
    A Bb;
    int in_a = 3;
    Aa = in_a;
    Bb = Aa;
    Aa.print(); //This should give 6. (3x2)
    Bb.print(); //This should give 30. (6x5)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将相同的运算符专门用于不同的特征 的相关文章

随机推荐

  • 仅查看当前用户对象的列表,Django REST

    我有 2 个视图 notes 和 notes 在注释模型中models py我有所有者变量 用于存储所有者的登录信息 因为我想要有很多用户 我不想让他们看到别人的笔记 所以我创建了权限 class IsOwner permissions B
  • 删除 python 列表中的重复项但记住索引

    如何删除列表中的重复项 保留项目的原始顺序并记住列表中任何项目的第一个索引 例如 删除重复项 1 1 2 3 yields 1 2 3 但我需要记住索引 0 2 3 我正在使用Python 2 7 我会以不同的方式解决这个问题并使用Orde
  • 获取调用C#方法的实例

    我正在寻找一种算法 可以在该方法中获取调用该方法的对象 例如 public class Class1 public void Method the question object a the object that called the m
  • SVN与外部通用代码

    目前 我正在尝试使用相同的代码为多个产品设置存储库 最好的解决方案是创建共享代码的真正库并以这种方式使用它们 然而 目前这需要很长时间 这个想法是拥有一个具有以下树的单个存储库 trunk Project1 Project2 Shared
  • 在android中比较两个日期是否在同一周内

    我有两个约会 他们是从 Calendar c Calendar getInstance year c get c YEAR month c get c MONTH month date c get c DATE 其他数据分为日期 月份 2
  • 在 Curl 请求中禁用 Javascript (PHP)

    有没有办法在 PHP 的 Curl 请求中禁用 Javascript 尝试模仿浏览器请求 来自禁用 Javascript 的浏览器 这可以通过标头 用户代理 cookie 来完成吗 Thanks 有没有办法在 PHP 的 Curl 请求中禁
  • 在php中将tiff转换为jpg?

    我有一台保存 TIFF 图像的服务器 大多数客户端都可以读取和显示 TIFF 图像 因此没有问题 但是 某些客户端无法处理此格式 但可以处理 JPG 我想到使用 PHP 的 GD 库为没有 TIFF 读取能力的客户端进行服务器端转换 但我注
  • Spark:强制读取模式时 Parquet DataFrame 操作失败

    火花2 0 2 当您拥有具有不同架构的镶木地板文件并在读取期间强制使用该架构时 就会出现此问题 即使您可以打印架构并运行show 好的 您无法对缺失的列应用任何过滤逻辑 以下是两个示例架构 assuming you are running
  • 从同一类的另一个方法中检索一个方法中的 NSMutableArray [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我是 iPhone 新手 我有一个小
  • SQL查询:列出一个表中未出现在另一表中的所有项目

    我正在开发一个训练跟踪程序 但我无法弄清楚 SQL 查询 我有3张桌子 employees trainingRecords masterList employees and trainingRecords是通过相关的empID fkey t
  • 在属性中传递静态数组

    是否可以绕过以下限制 在类中创建静态只读数组 public class A public static readonly int Months new int 1 2 3 然后将其作为参数传递给属性 public class FooAttr
  • 查询对象时 linq to sql + stackoverflow 异常

    好的 当我尝试查询主键 如果实体中的主键设置为 自动生成值 时 我已经确认只有这个问题 但如果没有这个 我该如何插入 抱歉 如果这是一个 linq2sql 菜鸟 但我刚刚开始使用它 如何在关闭此选项的情况下使用 Linq to Sql 同时
  • PHP 和 MySQL:显示某些内容的总和,按不同类别分类

    你能帮我一下吗 如果您能提供答案和解释 我会更加感激 因为我想了解更多 实际上我已经感谢这个社区了 对我的学习帮助很大 但只有答案对我来说就足够了 因为我真的需要这个代码 好的 现在我将定义问题 现在 假设我有包含这些列的表格 tbl tr
  • Express 应用程序中 helpers 文件夹的意义是什么?

    我正在尝试导出一个适合我们要求的最佳混合文件夹结构 但在查阅了很多文章和信息之后 我有一个用名称定义的文件夹helpers并有文件 js扩展 app controllers userController js models userSche
  • MATLAB:使用 ode45 时是否可以有两个事件值?

    我想要对运动方程的 ode45 计算有两个限制 位置和时间 我已经让时间事件起作用 但我不确定是否以及如何添加另一个事件来限制位置 编辑 我还有许多不同的粒子在一个 ODE 方程中耦合在一起 并且需要它们在到达 屋顶 时单独停止 因为它们都
  • 如何设置系统范围的umask?

    我在一个运行 Linux Debian 和 Ubuntu 的实验室工作 用户名和组名由 NIS 和 yp 处理 我们有一些公共用户 每个人都可以访问来运行实验 然后我们每个人都有自己的用户 此外还有一个我们都是其中成员的公共组 我怎样才能使
  • 如果成功或失败,如何返回 std::copy 的值?

    我在用std copy将对象复制到std deque到一个文件 代码工作正常 但我需要检查复制是否成功 因此我需要设置标志 否则抛出异常 我已经用谷歌搜索但找不到解决方案如何检查是否std copy已成功将值复制到文件中 有人可以照亮它吗
  • Java 放气响应

    大家好 我想为 tomcat 创建一个过滤器来压缩某些 MIME 类型的所有响应 有什么指导方针吗 String ae request getHeader accept encoding if ae null ae indexOf defl
  • 如何在 Node.js 插件中泵送窗口消息?

    在 Windows Nodejs 插件中 我创建了一个窗口来接收消息 Handle
  • 将相同的运算符专门用于不同的特征

    我想通过特征进行专业化来执行以下操作 Array Aa Scalar in a会使用overload I Array Aa Array Bb会使用overload II 在下面的代码中 overload II永远不会习惯 有人提到过T1不能