Como faço para passar um genérico :: Lista por referência?
-
22-08-2019 - |
Pergunta
Em uma tentativa de envolver algum código não gerenciado em um gerenciado .dll Eu estou tentando converter um Generic::List
de pontos de dados em um std::vector
. Aqui está um trecho do que eu estou tentando fazer:
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
// ...
}
}
}
Compilar este dá-me:
Erro C3699: '&': não pode usar este engano no tipo 'const Sistema :: Coleções :: Genérico :: List'
Eu provavelmente esqueceu de algo fundamental aqui (eu sou relativamente novo para o .net maneira de fazer as coisas), mas que se parece com código razoavelmente válida para mim ..?
[Edit] Eu tentei ambas as sugestões de Andy e Dario e eles trabalham, mas como faço para acessar os membros da lista de entrada? Eu tentei todos os tipos de combinações de dreferencing e nada parece compilar:
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;
}
... tanto me dar:
Erro C2662: 'Sistema :: Coleções :: Genérico :: Lista :: Count :: get': não é possível converter 'this' ponteiro da 'const Sistema :: Coleções :: Genérico :: Lista' para 'System :: Coleções :: Genérico :: Lista% '
... assim como você acesse a referência / ponteiro?
Solução
Como List<T>
é uma classe .NET gerenciado, ele é passado pelo conseguiu GC-Handle indicado por ^ e não por C ++ -. De referência
Ex:
void ListToVec(List<double>^ input_list, std::vector<double>& out)
Você não precisa const
adicional aqui. A notação List<T>^%
cria uma referência de rastreamento (comparável a C ++ - ponteiros) em vez de uma ligação por referência.
Apenas acessar os membros por list->...
e list[...]
.
Outras dicas
De acordo com a Herb Sutter , %
é o passe objeto gerenciado pelo caracter de referência. Converter o código para o seguinte e ele deve funcionar:
void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector
{
// Copy the contents of the input list into the vector
// ...
}
Editar : Eu acho que o const
está causando os problemas, embora eu não sei por que. Se você alterar o argumento List
a não ser const
, em seguida, a primeira função será compilado se você usar o operador ->
, enquanto a segunda função será compilado se você usar o operador .
(Eu não sei por que existe essa diferença - ele doesn' t faz muito sentido).
Dito isto, se tudo o que você quer fazer é copiar os elementos na List
ao vector
, então você realmente quer usar ^
. Pense nisso como ter uma referência para o objeto gerenciado. Eu acho que %
seria usado se você quiser passar a referência "por referência" (ou seja Reassign input_list
para outra coisa dentro ListToStdVec()
, e ter o chamador ver o resultado desse trabalho. No entanto, uma vez que você usar o operador .
ao acesso membros ao usar %
, que me diz que eu não entendo o propósito de que em tudo.