2009-03-25 17 views
8

tengo la siguiente clase en C++/CLI y una instanciación de plantilla explícita para la int primitivo ..Utilice C++ CLI clase de plantilla en C#

template<typename T> 
public ref class Number 
{ 
    T _value; 
public: 
    static property T MinValue 
    { 
     T get() 
     { 
      return T::MinValue; 
     } 
    } 

    static property T MaxValue 
    { 
     T get() 
     { 
      return T::MaxValue; 
     } 
    } 

    property T Value 
    { 
     T get() 
     { 
      return _value; 
     } 

     void set(T value) 
     { 
      if(value<MinValue || value > MaxValue) 
       throw gcnew System::ArgumentException("Value out of range"); 

      _value = value; 
     } 
    } 

}; 

template ref class Number<int>; 

En la elaboración de este y la inspección de la generada a partir de conjunto reflector soy capaz para ver una clase llamada Number<int> pero al intentar crear una instancia de esta misma clase en C#, el compilador se queja de que alguna clase System::Number no toma un argumento de plantilla. ¿Qué estoy haciendo mal? ¿Se puede hacer esto?

Respuesta

10

Tengo un problema, declaro una clase adicional que hereda la clase Number<int>. Esta clase ahora es visible en C# y se puede crear una instancia.

public ref class MyInt32 : public Number<int> 
{ 
}; 
1

Si su objetivo es crear un tipo parametrizado en C++ CLI y, a continuación, utilizar ese tipo de C#, creo que es necesario crear un tipo genérico en lugar de un tipo de plantilla (ver Stan Lippman's Blog de las razones por las ambos métodos existen). Consulte here para obtener información sobre cómo crear tipos genéricos en la CLI de C++.

+0

Lamentablemente, la creación de tipos genéricos derrota el propósito de utilizar C++/CLI ya que C# puede hacer lo mismo y es igualmente ineficaz. –

+0

Entonces parece que la respuesta que publicaste es el único camino a seguir (aunque eso en cierto modo frustra el propósito de usar plantillas). Como dijo @JaredPar, las plantillas no son lo mismo que los genéricos, y solo C++ puede usar plantillas. – Andy

9

Reflector es mintiendo un poco aquí. El nombre de la clase no es realmente el número <int>. En realidad es 'Número <int>'. Observe las comillas simples. Estos solo son visibles cuando ve el nombre del tipo con ildasm.

I crea Esto se hace para hacer que el tipo sea inaccesible en la mayoría de los idiomas ya que no tienen forma de entender cómo funciona realmente una plantilla de C++. Esto hace que solo sea visible para el compilador de C++, ya que es el único compilador de MS que realmente admite plantillas (templates! = Genéricos).

+0

Y creo que las plantillas C++/CLI también tienen un modificador requerido, ildasm también debería mostrar eso. La CLI prohíbe que las herramientas que no entienden un modificador requerido utilicen el miembro. –