¿Cómo paso una lista genérica::por referencia?
-
22-08-2019 - |
Pregunta
En un intento de incluir código no administrado en un .dll administrado, estoy intentando convertir un Generic::List
de puntos de datos en un std::vector
.Aquí hay un fragmento de lo que estoy tratando de hacer:
namespace ManagedDLL
{
public ref class CppClass
{
void ListToStdVec( const List<double>& input_list, std::vector<double>& output_vector )
{
// Copy the contents of the input list into the vector
// ...
}
void ProcessData( List<double> sampleData )
{
std::vector<double> myVec;
ListToStdVec( sampleData, myVec );
// Now call the unmanaged code with the new vector
// ...
}
}
}
Compilando esto me da:
error C3699:'&':no se puede utilizar esta dirección indirecta en el tipo 'const System::Collections::Generic::List'
Probablemente me he perdido algo fundamental aquí (soy relativamente nuevo en la forma de hacer las cosas de .net), pero me parece un código razonablemente válido.?
[Editar] Probé las sugerencias de Andy y Dario y funcionan, pero ¿cómo accedo a los miembros de la lista de entrada?Probé todo tipo de combinaciones de referencias y nada parece compilarse:
void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector )
{
int num_of_elements = input_list->Count;
}
void ListToStdVec( const List<double>^ input_list, std::vector<double>& output_vector )
{
int num_of_elements = input_list.Count;
}
...ambos me dan:
error C2662:'Sistema::Colecciones::Genérico::Lista::Contar::obtener' :no se puede convertir 'este' puntero de 'const System::Collections::Generic::List' a 'System::Collections::Generic::List %'
... entonces, ¿cómo se accede a la referencia/puntero?
Solución
Como se List<T>
una clase .NET administrado, se ha logrado aprobada por GC-Handle denotado por ^ y no por C ++ -. De referencia
Ejemplo:
void ListToVec(List<double>^ input_list, std::vector<double>& out)
No es necesario const
adicional aquí. La notación List<T>^%
crea una referencia de seguimiento (comparable a C ++ - punteros) en lugar de una llamada por referencia.
Sólo el acceso a los miembros de list->...
y list[...]
.
Otros consejos
Según Herb Sutter , %
es el pase de objeto gestionado por el carácter de referencia. Convertir el código a la siguiente, y debería funcionar:
void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector
{
// Copy the contents of the input list into the vector
// ...
}
Editar : Creo que el const
está causando los problemas, aunque no estoy seguro de por qué. Si cambia el argumento List
a no ser const
, a continuación, la primera función compilará si se utiliza el operador ->
, mientras que la segunda función compilará si se utiliza el operador .
(No estoy seguro de por qué existe esa diferencia - que doesn' t tiene mucho sentido).
Dicho esto, si todo lo que desea hacer es copiar los elementos en el List
a la vector
, entonces usted realmente desea utilizar ^
. Pensar que por tener una referencia al objeto administrado. Creo que %
se utilizaría si quieres pasar la referencia "por referencia" (es decir, reasignar input_list
a otra cosa dentro de ListToStdVec()
, y tener la persona que llama ver el resultado de esa asignación. Sin embargo, dado que se utiliza el operador .
de acceso miembros cuando se utiliza %
, que me dice que no puede entender el propósito de eso en absoluto.