Использование шаблона функции C ++ из оболочки CLI - PullRequest
0 голосов
/ 21 ноября 2018

Я создаю C ++ / CLI DLL, чтобы иметь возможность связывать простую C ++ DLL с приложением C #.Простая C ++ DLL предоставляется сторонней организацией, и я не могу ее изменить.

Эта простая C ++ DLL содержит несколько шаблонов функций-членов, например:

  1. plainЗаголовочный файл DLL C ++:

    class pureCPP
    {
        template<typename T>
        void usefulFunctionA(T &b, T const &a)
        {
            /* Implementation of the function */
        }
    }
    

Поэтому моя идея состоит в том, чтобы отразить это в заглавном файле DLL CLI:

Заголовочный файл DLL CLI:

public ref class CLI_DLL
{
    template<typename T>
    void usefulFunctionB(T &b, T const &a)
    {
        pureCppPtr->usefulFunctionA(b, a);
    }

    PureCPP *pureCppPtr;
}

А затем, например, в исполняемом файле C # просто вызовите:

CLI_DLL cliDLL = new CLI_DLL;
double a, b;
cliDLL.usefulFunctionB<double>(a, b);

Это выполнимо?Или я вынужден просто создавать экземпляры перегрузок для каждого возможного типа шаблона функции?

Я прочитал C # имеет что-то под названием generics , могу ли я использовать эту технику для достижения чего-то подобного?Пока что каждая найденная статья относится либо к шаблонам классов (а не только к их методам), либо предлагает сделать явное создание экземпляров в CLI нужных типов, чего я бы хотел избежать, если это возможно (предположим, каждая функция).может использоваться 1000 различными типами ... Я думаю, было бы не очень хорошо копировать 1000 различных экземпляров).

Я совершенно новичок в C #, но AFAIU, передавая аргументы (в этомрегистр) из универсальной функции в шаблон не будет выполнимым, поскольку первые разрешаются во время выполнения, а последние - во время компиляции, и в этом случае я 'Пришлось бы изменить предыдущую реализацию на что-то вроде этого:

  • Заголовочный файл DLL CLI:

    public ref class CLI_DLL
    {
        /* Only define the template here */
        template<typename T>
        void usefulFunctionB(T &b, T const &a);
    
        PureCPP *pureCppPtr;
    }
    
  • Исходный файл CLI DLL:

    /* Explicitly instantiate the template in the source file */
    template<>CLI_DLL::usefulFunctionB<double>(double &A, double const &B)
    {
        pureCppPtr->usefulFunctionA<double>(b, a);
    }
    

и так далее для каждого типа, который мне нужен.Другой способ (от шаблона к универсальному) представляется возможным, правда?

(Кстати, и в качестве дополнительного вопроса, действительно ли необходимо явно указывать вызываемый тип, в данном случае "double"? Iникогда не понимал, почему в некоторых случаях Visual Studio не может автоматически вычитать типы из шаблонов, как это делают CLang или GCC).

Чего я действительно, ДЕЙСТВИТЕЛЬНО любил избегать, и вместо этогоЯ бы хотел сделать что-то вроде первого кода, который я раскрыл.

Заранее большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...