Я создаю C ++ / CLI DLL, чтобы иметь возможность связывать простую C ++ DLL с приложением C #.Простая C ++ DLL предоставляется сторонней организацией, и я не могу ее изменить.
Эта простая C ++ DLL содержит несколько шаблонов функций-членов, например:
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).
Чего я действительно, ДЕЙСТВИТЕЛЬНО любил избегать, и вместо этогоЯ бы хотел сделать что-то вроде первого кода, который я раскрыл.
Заранее большое спасибо.