在泛型中实现算术?

2023-12-31

是否可以像您一样在 C# 泛型中实现基本算术(至少是加法)使用 C++ 模板 http://nonchalantlytyped.net/blog/2010/04/24/church-numerals-in-c/?我已经尝试了一段时间让它们启动并工作,但 C# 不允许您多次声明相同的泛型类型,就像使用模板一样。

广泛的谷歌搜索没有提供答案。

编辑:谢谢,但我正在寻找一种在编译时进行算术的方法,在泛型类型中嵌入类似教堂数字的东西。这就是为什么我链接了我所做的文章。算术in泛型类型,而不是算术类型的实例通用类型。


不幸的是,您不能对泛型类型使用算术运算

T Add(T a, T b)
{
    return a + b; // compiler error here
}

在 C# 中不起作用!

但是您可以创建自己的数字类型并重载运算符(算术、相等和implicit, explicit)。这让您可以以一种非常自然的方式与他们一起工作。但是,您无法使用泛型创建继承层次结构。您将必须使用非通用基类或接口。

我只是用向量类型来做的。这里有一个缩短的版本:

public class Vector
{
    private const double Eps = 1e-7;

    public Vector(double x, double y)
    {
        _x = x;
        _y = y;
    }

    private double _x;
    public double X
    {
        get { return _x; }
    }

    private double _y;
    public double Y
    {
        get { return _y; }
    }

    public static Vector operator +(Vector a, Vector b)
    {
        return new Vector(a._x + b._x, a._y + b._y);
    }

    public static Vector operator *(double d, Vector v)
    {
        return new Vector(d * v._x, d * v._y);
    }

    public static bool operator ==(Vector a, Vector b)
    {
        if (ReferenceEquals(a, null)) {
            return ReferenceEquals(b, null);
        }
        if (ReferenceEquals(b, null)) {
            return false;
        }
        return Math.Abs(a._x - b._x) < Eps && Math.Abs(a._y - b._y) < Eps;
    }

    public static bool operator !=(Vector a, Vector b)
    {
        return !(a == b);
    }

    public static implicit operator Vector(double[] point)
    {
        return new Vector(point[0], point[1]);
    }

    public static implicit operator Vector(PointF point)
    {
        return new Vector(point.X, point.Y);
    }

    public override int GetHashCode()
    {
        return _x.GetHashCode() ^ _y.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        var other = obj as Vector;
        return other != null && Math.Abs(other._x - _x) < Eps && Math.Abs(other._y - _y) < Eps;
    }

    public override string ToString()
    {
        return String.Format("Vector({0:0.0000}, {1:0.0000})", _x, _y);
    }
}

距离我回答这个问题已经过去十多年了,终于C# 11 功能 - 接口中的静态虚拟成员 https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/static-virtual-interface-members.NET 7 中引入允许我们做通用数学 https://learn.microsoft.com/en-us/dotnet/standard/generics/math以及许多其他事情。

接口现在可以声明静态工厂方法,而不限制我们在泛型上下文中使用无参数构造函数。

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

在泛型中实现算术? 的相关文章

  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • .NET 中是否有内置函数可以对密码进行哈希处理?

    我看到这个问题加密 散列数据库中的纯文本密码 https stackoverflow com questions 287517 encrypting hashing plain text passwords in database 我知道我
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 重载<<的返回值

    include
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • IEnumerable 与 IReadOnlyList

    选择有什么区别IEnumerable
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le

随机推荐

  • .Net Twitter OAuth 如何执行成功的 GET 请求

    按照本教程 我能够成功向 Twitter API 发布帖子并更新我的状态 但是我在处理成功的 GET 请求时遇到问题 我正在尝试修改 Post 请求来完成此操作 但在我的网络异常上不断收到 无效协议 错误 以下是将发布状态更新的工作代码 h
  • 原则 2. orm:schema-tool:update 。设置开始ID

    当我使用 bin doctrine orm fixtures load使用示例数据填充表首先迁移设置自动增量表 ID 如 1 2 3 4 5 等 第二次之后orm fixtures load迁移命令它会清除所有数据并设置 id 如 5 6
  • 如何在 Vim 中设置工作/当前目录?

    因此 当我想使用 e 命令创建新文件时 我不想指定整个路径 而只想指定新文件名 能做到吗 正如已经建议的 您可以使用 autochdir 它将更改为您打开的文件的目录 另一个选项是 cd mydirectory 这将更改目录 这可以是绝对路
  • ruby - 覆盖方法然后恢复

    我正在尝试找到一种方法 可以覆盖方法 执行某些操作 然后在不留下任何工件的情况下进行恢复 我已经使用 mocha 实现了这个 但显然这不会在生产应用程序中运行 请注意 新方法有参数 而旧方法没有 示例如下 require rubygems
  • CSS 宽度和高度属性的最大像素值是多少?

    最大有效值是多少pxCSS 的值width and height属性接受吗 我目前正在构建一个网络应用程序 它创建一个非常大的可缩放容器元素 我想知道实际的限制是什么 在元素上使用某些浏览器附带的 CSS 检查器10000000000px
  • 从 javascript 运行 bat 文件

    我正在尝试使用 javascript 运行 bat 文件 我尝试过使用 powershell 但它似乎无法正常工作 这是我尝试过的代码 var oShell WScript CreateObject WScript Shell oShell
  • 将浮动栏添加到滚动视图,就像 Facebook iOS 应用程序的时间线中一样

    我一直在尝试向我的测试项目添加不同的交互 但在添加 Facebook 的帖子状态栏之类的东西时遇到了麻烦 该状态栏位于时间线滚动视图上 并在向下滚动时随滚动视图一起滚动视图 但当您向上滚动时仍停留在导航栏下方 我一直在创建一个单独的 UIV
  • 如何在 docker 上运行电子应用程序

    我创建了一个托管电子应用程序的存储库的分支 该应用程序是一个聊天客户端 https github com Serkan devel BetterDiscordApp docker https github com Serkan devel
  • 是否可以克隆 ValueType?

    当已知对象是装箱 ValueType 时 是否可以克隆对象 而无需编写特定于类型的克隆代码 一些代码供参考 List
  • 如何从 statsmodels 中检索模型估计值?

    从这样的数据集 import pandas as pd import numpy as np import statsmodels api as sm A dataframe with two variables np random see
  • 如何使我的代码诊断语法节点操作对关闭的文件起作用?

    我正在使用 Roslyn 在 VS2015 预览版中 构建一组代码诊断 理想情况下 我希望它们产生的任何错误都充当持久错误 就像我违反了正常的语言规则一样 有很多选择 但我很难让其中任何一个都能持续工作 我已经成功实现了一个基本的语法节点操
  • WP7 XNA游戏:如何适应不同手机分辨率?

    我创建了一款针对 800 x 480 分辨率的游戏 但对其适应其他 WP7 分辨率很感兴趣 另外 我听说游戏可以通过 Mono 和 ExEn 移植到 iPhone 和 Android 从而开放大量其他屏幕分辨率 处理这个问题的正确方法是什么
  • Linux - 在 Nouveau 驱动程序上运行 Android 模拟器

    Linux Debian Sid x64 内核 4 14 Nvidia GPU 我无法在开放的 Nouveau 驱动程序上运行 Android 模拟器 我没有可以发布任何错误消息 只是分段错误 当我选择软件渲染时 它可以工作但无法使用 运行
  • 返回接口的函数

    为什么我可以说 CreateLion 的结果 指向实现 Cat 接口的结构的指针 是 Cat 接口的实例 但我不能说 CreateLion 是 返回 Cat 的函数 类型界面 实现此类行为的标准 Golang 方法是什么 package m
  • 如何向 JAXB 中的文本元素添加属性?

    如何使用 JAXB 生成以下 XML 片段
  • Codeigniter 图片和源 URL

    我的 Codeigniter URL 有问题 我有一个控制器 welcome php
  • 如何从数组末尾删除第 n 个元素

    我知道您可以使用 array pop 删除数组中的最后一个元素 但如果我想删除最后 2 或 3 个 我该怎么办 那么如何删除该数组中的最后 2 个元素呢 Use 数组拼接 http www php net array splice并指定要删
  • 测试给定数组是否是子数组

    这是 Numpy 初学者提出的一个基本问题 我有一个 5 行 2 列的 2D 数组 您可以将其视为 10 个 2d 向量 我想测试给定的向量是否在表内 例如 gt gt gt tableau array range 10 dtype uin
  • 自定义 Google Maps API v3 中的默认 InfoWindow

    我想知道是否可以自定义当用户单击 Google 在其默认地图上显示的各种企业时弹出的默认信息窗口 请参阅 screenie 我想添加功能 让人们在浏览地图时偶然发现这些位置时 固定 这些位置 目前无法监听 POI 图标上的任何点击事件 因此
  • 在泛型中实现算术?

    是否可以像您一样在 C 泛型中实现基本算术 至少是加法 使用 C 模板 http nonchalantlytyped net blog 2010 04 24 church numerals in c 我已经尝试了一段时间让它们启动并工作 但