2009-04-24 5 views
4

J'ai un C++ classe qui est très simple:Comment puis-je utiliser générique dans un opérateur implicite?

struct Pt_t 
{ 
    T x, y; 
    template <class T2> operator Pt_t<T2>() { Pt_t<T2> pt = {x, y}; return pt; } 
}; 

Cela me permet de créer un pt qui a T comme tout type que je veux. Je peux également faire Pt_t<s8> = Pt_t<u64>; sans problème. Comment est-ce que je fais la même chose en C#? J'ai essayé le ci-dessous et ai eu une erreur:

class Pt<T> 
    { 
     public T x, y; 
     //between operator and <T2>, error CS1031: Type expected 
     public static implicit operator<T2> Pt<T>(Pt<T2> v) { 
      Pt<T> r = new Pt<T>(); 
      r.x = v.x; 
      r.y = v.y; 
      return r; 
     } 
    } 
+0

AFAIK, "Pt_t" est pas un symbole de l'opérateur en C++ ... c'était-il que vous avez essayé d'écrire avant qu'il ne soit mutilée (en C++, ainsi que C#)? –

+0

@Pontus - il essaie d'être un opérateur de conversion ... à Pt avec un argument de type générique différent –

+0

Ah: un nom de classe - aurait dû lire plus attentivement! –

Répondre

2

Non, je ne pense pas que ce soit possible. Vous devrez peut-être ajouter une méthode, telle que To<T>.

Le problème suivant sera « comment obtenir T2-T - vous ne pouvez pas leur attribuer une option pourrait être un délégué de conversion:

public Pt<TDestination> To<TDestination>(
    Converter<T, TDestination> converter) 
{ 
    if (converter == null) throw new ArgumentNullException("converter"); 
    Pt<TDestination> t = new Pt<TDestination>(); 
    t.x = converter(x); 
    t.y = converter(y); 
    return t; 
} 
... 
var p = new Pt<int> { x = 1, y = 2 }; 
var p2 = p.To(t => t.ToString()); // a Pt<string> 
+0

Merci beaucoup. Je peux voir où aller à partir d'ici. (.toShort, toUshort, tout en utilisant un simple convertisseur d'une ligne <> ou l'utilisateur To (OwnConv); –

2

Vous pouvez utiliser Nemerle: (http://github.com/rsdn/nemerle):.

using System.Console; 

class A[T] 
{ 
    public static @:[From](x : A[From]) : A[T] 
    { 
     A() 
    } 
} 


class Base{} 
class Derived{} 


def a = A.[Derived](); 
def b : A[Base] = a; 

WriteLine($"$a $b"); 

sortie:

A`1[Derived] A`1[Base] 

réflecteur pour le code:

internal class A<T> 
{ 
    public static implicit operator A<T><From>(A<From> x) 
    { 
     return new A<T>(); 
    } 
} 

public class a 
{ 
    public static void Main() 
    { 
     A<Derived> a = new A<Derived>(); 
     A<Base> a2 = (A<Base>) a; 
     Console.WriteLine(Convert.ToString(a) + " " + Convert.ToString(a2)); 
    } 
} 
Questions connexes