В настоящее время я пишу набор Wrappers для некоторого собственного кода на C++. В оболочке я беру управляемый массив в качестве ввода и намерен использовать содержимое массива для вызова собственного конструктора C++. По какой-то причине мне, кажется, нужно либо привязать массив, либо извлечь значения отдельно от вызова конструктора. Вот несколько примеров того, что я имею в виду.Доступ к управляемым массивам и пиннингам
Конструктор для нативного типа имеет тип подписи, как это:
NativeType(const double &d)
Первоначальная попытка:
public ref class ExampleWrapper
{
ExampleWrapper(array<double>^in)
{
for(int i= 0; i< in->Length; ++i)
{
NativeType test(in[i]);
}
}
}
Это возвращается с ошибкой и не будет компилироваться. Дальше я пробовал это
public ref class ExampleWrapper
{
ExampleWrapper(array<double>^in)
{
for(int i= 0; i< in->Length; ++i)
{
double d = in[i];
NativeType test(d);
}
}
}
который, кажется, работает нормально. Наконец, я попытался укрепить массив следующим образом:
public ref class ExampleWrapper
{
ExampleWrapper(array<double>^in)
{
pin_ptr<double> pin_in = &in[0];
for(int i= 0; i< in->Length; ++i)
{
NativeType test(pin_in[i]);
}
}
}
Который также, кажется, работает нормально.
Что я хотел бы знать, почему первый пример не работает, в то время как другие два, похоже, работают нормально. Кроме того, я хотел бы знать, какой предпочтительный метод использовать.
Итак, возникает вопрос, что конструктор получает ссылку? Я заметил, что у меня есть аналогичный пример, где у конструктора есть сигнатура типа NativeType (int i), которая, кажется, компилируется просто отлично, с эквивалентом первого примера. – Taus
Да, это будет нормально работать, поскольку вы будете передавать примитивное значение, а не адрес объекта/памяти. – Amit