Export функций шаблона

Здравстуйте. Чего то я запутался вообще с этим си++.

Вот есть такая функция:

template <class T> void SafeRelease(T** ppT)
{
	if (*ppT)
	{
		(*ppT)->Release();
		*ppT = NULL;
	}
}

Мне нужна экспортная функция чтобы использовать ее в C#.
Там все указатели будут как IntPtr.

Как мне написать экспорт чтобы можно было передавать любой указатель а внутри вызывался бы SafeHandle.

extern "C" __declspec(dllexport) void DisposePtr(void * ptr)
{
	SafeRelease((class T)&ptr);
}

А что туда передается?

Непонятно как тут шаблон поможет. Наверно надо просто кастануть к нужному классу (где функция Release).

В сях туда передается любой класс. И он как бы нормально все хавает. Но для шарпа нужен конкретный тип. И даже если передавать указатель типа IntPtr то тогда надо в си както привести его к классу. А как?

Так а указатель откуда берется? В C# передается указатель из С++, и потом он снова передается в С++?

В си создаются объекты классов. Чтобы не парится с переносом полей я возвращаю просто указатель на объект. И потом при освобождении ресурсов передаю указатель обратно в си

А там точно нужен шаблон, чтоб принимать любые классы?

Если Release объявлен в каком-то базовом классе (как интерфейс IDisposable в .NET), то можно его принимать вместо шаблона, и к нему кастовать.

МС говорит его нужно определять самостоятельно.
ТУт как выход видимо сделать две разых функции которая внутри си будет уничтожать объект соответствующим образом

Если передавать указатель на какой-то базовый класс, то через dynamic_cast можно проверять и кастовать.
Но оказывается с void* нельзя. https://stackoverflow.com/a/45966708/964478

Так если тут только свои классы, то можно им завести и базовый класс с объявлением этой функции.
Хотя из-за void* это тут тоже не поможет.

Да не особо хочется городить кучу кода. Думал тут как то можно по простому… ну да ладно.