Перевожу код из C++/CLI, который использует шаблоны и указатели в C#.
Однако C# пока ещё не позволяет использовать указатели с обобщениями.
struct A<T> {}
A<int>* p; // :(
Один из вариантов это через Marshal.PtrToStructure, что приведёт к лишним копиям, и 'struct' вдобавок придётся заменить на 'class'.
Другое решение через генерацию в виде .tt файла.
Здравствуйте, _NN_, Вы писали:
_NN>Перевожу код из C++/CLI, который использует шаблоны и указатели в C#. _NN>Однако C# пока ещё не позволяет использовать указатели с обобщениями.
Если уж портируете на шарп, зачем нужно оставлять указатели? Или опять — для скорости?
Здравствуйте, Nikolay_Ch, Вы писали:
N_C>Если уж портируете на шарп, зачем нужно оставлять указатели? Или опять — для скорости?
Да.
В этом месте любое копирование будет во вред.
Здравствуйте, _NN_, Вы писали:
N_C>>Если уж портируете на шарп, зачем нужно оставлять указатели? Или опять — для скорости? _NN>Да. _NN>В этом месте любое копирование будет во вред.
Здравствуйте, Sinix, Вы писали:
S>ref return-ы из c# 7 не подойдут?
Не очень.
У меня вызов функции из нативного кода, где я получаю простой указатель.
Далее я его обрабатываю по разному в зависимости от платформы и заголовка.
Похоже, всё же, наименее рискованным будет в C++ коде заменить .NET типы на C++-ные и организовать интероп в C#.
Кстати, как лучше всего перекидывать в C# тип вроде hash_map<wstring, struct Data { uint64_t x; uint64_t y;}> (в оригинале Dictionary<String, Data>) ?
Здравствуйте, _NN_, Вы писали:
__NN>Похоже, всё же, наименее рискованным будет в C++ коде заменить .NET типы на C++-ные и организовать интероп в C#.
Если нужен интероп _и_ производительность, то я бы не мучался и делал бы всё в нативе. Накладные расходы невесёлые будут, особенно с non-blittable. Старые guidelines примерно то же советуют.
_NN>Кстати, как лучше всего перекидывать в C# тип вроде hash_map<wstring, struct Data { uint64_t x; uint64_t y;}> (в оригинале Dictionary<String, Data>) ?
Никак емнип. Или c-style (структуры и массивы), или com-интероп. Ну, т.е. можно прокинуть указатель на словарь и сделать нативные методы для вытаскивания значений из словаря, но как-то это печально совсем.
Но я тот ещё спец в интеропе, могу ошибаться.
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, _NN_, Вы писали:
__NN>>Похоже, всё же, наименее рискованным будет в C++ коде заменить .NET типы на C++-ные и организовать интероп в C#. S>Если нужен интероп _и_ производительность, то я бы не мучался и делал бы всё в нативе. Накладные расходы невесёлые будут, особенно с non-blittable. S>Старые guidelines примерно то же советуют.
Полностью нативно никак да и не хочется
Вот если бы были шаблоны в C# не было бы проблем выбора.