Ну, я еще не нашел что-то, что говорит о том, что это невозможно, хотя я начинаю думать, что это возможно. Можете ли вы сделать эту работу?
using namespace System;
template <typename T>
void unset(Nullable<T>& var) { var = Nullable<T>(); }
void unset(String^% var) { var=nullptr; }
//this is really a C# class in my situation, so I can't change its types
public ref class Foo
{
public:
property Nullable<Decimal> Dec;
property Nullable<int> Num;
property String^ Str;
};
int main()
{
Foo^ foo = gcnew Foo;
foo->Dec = Decimal(1.2);
foo->Num = 3;
foo->Str = "hi";
unset(foo->Dec);
unset(foo->Num);
unset(foo->Str);
Console::WriteLine(foo->Dec);
Console::WriteLine(foo->Num);
Console::WriteLine(foo->Str);
}
Обновление: unset вызывается из макроса, генерирующего код, который вызывается примерно для 50 параметров. Я бы предпочел не создавать разновидности макроса для каждого типа.