代码之家  ›  专栏  ›  技术社区  ›  Ken

C数字基类[重复]

  •  7
  • Ken  · 技术社区  · 17 年前

    我想写一个可以接受任何数字的c方法。比如:

    public static T Sum(T a, T b) where T : number {  // (not real code)
        return a + b;
    }
    

    但我看不到C中的“数字”基类,就像我使用过的大多数其他语言一样。数值类型有IComparable、IFormatable、IConvertible、IComparable和IEquatable,但似乎没有任何算术功能。它们都是结构,除了对象之外,没有明显的公共超类。(如果我把这里的意思搞砸了,请原谅我,因为我不太熟悉C结构,也不太熟悉它们与类相似或不同的所有方式。)

    我是否遗漏了一些东西,或者是否不可能在不声明a和b在“+”上下文中究竟是什么的情况下,用c编写一个执行“a+b”的方法?

    6 回复  |  直到 15 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    你将不得不使用过载。有点像 Math 类的作用是 Math.Max 它支持所有数字类型。

    这个 link CD提出的建议也很有资源。

        2
  •  3
  •   Community Mohan Dere    9 年前

    见 this SO question 用于类似的讨论。

    此外,如果您愿意为每个要用于的.NET核心编号类型创建单独的类型,您也可以这样做(通过一些繁琐的工作)。

    创建两个结构,称为say、myint和mydecimal,用作CTS int32的外观,以及decimal核心类型(它们包含相应类型的内部字段)。每个结构都应具有一个以核心CTS类型的实例作为输入参数的ctor。

    使每个实现一个称为inumeric的空接口

    然后,在您的通用方法中,根据这个接口进行约束。缺点是,无论您想在何处使用这些方法,都必须构建适当的自定义类型的实例,而不是核心CTS类型,并将自定义类型传递给该方法。

    注意:对自定义结构进行编码以正确模拟核心CTS类型的所有行为是一个冗长的部分…您必须实现几个内置的CLR接口(IComparable等),并重载所有的算术和布尔运算符…

        3
  •  2
  •   C. Ross trotttrotttrott    17 年前

    不幸的是,不存在这样的类/接口。

        4
  •  2
  •   Botz3000 Amir Sheng    17 年前

    int和其他数值类型是valuetypes。如前所述,你所能做的就是 where T: struct . 那么,您可以使用反射来检查类型参数是否实现了加法…但我不确定这是否是个好主意。

        5
  •  0
  •   Randolpho    17 年前

    你能做的最好的就是 where T : struct 它需要值类型;所有数字都是值类型。

    不幸的是,所有用户定义的结构也是这样,所以这就是缺点。没有可接受所有数值类的特定泛型。

    我甚至不愿意提出这个建议,但是你 可以 考虑对 T 在方法和投掷如果 T 不是int、long、short、float或double。不幸的是,这对程序员在编译时没有帮助。

        6
  •  0
  •   Marc Gravell    17 年前

    这是一个非常常见的问题;如果您使用.NET 3.5,那么在 MiscUtil ,通过 Operator 类,它支持内置类型和带有运算符(包括“提升”运算符)的任何自定义类型;特别是,这允许使用 泛型 例如:

    public static T Sum<T>(this IEnumerable<T> source) {
        T sum = Operator<T>.Zero;
        foreach (T value in source) {
            if (value != null) {
                sum = Operator.Add(sum, value);
            }
        }
        return sum;
    }
    

    或者另一个例子; Complex<T>