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

typedef等价于c中的重载#

  •  0
  • BCS  · 技术社区  · 16 年前

    我有一堆代码,它们有很多不同含义的整数(我更喜欢一个通用的解决方案,但是对于一个特定的例子:月份与月份与年份等)。我希望能够基于这些含义重载类构造函数。

    例如

    int a; // takes role A
    int b; // takes role B
    
    var A = new Foo(a);  // should call one constructor
    var B = new Foo(b);  // should call another constructor
    

    显然这不起作用,但是如果我能定义一个类型(不仅仅是别名),它是 int 除了这个名字:

    typedef int TypeA;  // stealing the C syntax
    typedef int TypeB;
    

    我可以做我需要的过载,让类型系统跟踪什么是什么。 特别是,这将使我能够确保值不会混淆,例如,从函数返回的值(以年为单位)不会用作月中的某一天。

    还有别的路吗 class struct 包装工用C来做这个?


    如果该解决方案也适用于浮点和双精度,那就太好了。

    4 回复  |  直到 15 年前
        1
  •  13
  •   Jeff Yates    16 年前

    没有直接typedef等效项,但可以执行以下操作:

    using TypeA = int;
    using TypeB = int;
    

    但是,这只是对类型的别名,而不是创建新的强类型。因此,编译器仍然将它们视为 int 解析方法调用时。

    更好的解决方案可能是创建简单的包装类 int 并提供隐式强制转换,例如:

    struct TypeA
    {
       public TypeA(int value)
       {
          this.realValue = value;
       }
    
       private int realValue;
       public static implicit operator int(TypeA value)
       {
         return this.realValue;
       }
    
       public static implicit operator TypeA(int value)
       {
         return new TypeA(value);
       }
    }
    

    然而,在大多数情况下, enum 会更合适。

        2
  •  6
  •   Mike_G    16 年前

    这可能还远着呢,但你不能用枚举来实现吗?枚举基是int,但是类型化的,您可以根据传递的枚举类型定义不同的构造函数。

        3
  •  2
  •   Moose    16 年前

    如果只是为了构造器,你不能用这样的方法吗?

     int dom = 5;
    int doy = 100;
    
    Foo b = Foo.NewFromDayoftheMonth(dom);
    
    Foo c = Foo.NewFromDayoftheYear(doy);
    

    其中每个方法都是静态的,并根据传入的参数创建一个新的foo对象。

    对于我来说,这似乎是一个解决方案,因为这里没有其他的解决方案。

        4
  •  0
  •   thinkbeforecoding    16 年前

    我还将围绕以下值创建一个结构:

    public struct TypeA
    {
      private int value;
      public TypeA(int value)
      {
        this.value = value;
      }
    
      public static explicit operator int(TypeA a)
      {
         return a.value;
      }
    
      public static explicit operator TypeA(int value)
      {
         return new TypeA(value);
      }
    }
    

    您还可以声明运算符来组合类型和方法,以在int值周围提供丰富的类型。

    年份类型可以证明 IsLeap 属性,一个月中的某一天可以限制为1到31之间的值,并提供一个特殊的算法。