我正在尝试实现一个在C ++端包装古代库的泛型函数。旧代码早于模板,并且有许多函数形式为fooInt,fooDouble,fooObject等。理想情况下,此函数调用可以使用单个泛型函数foo完成。我遇到了一些试图实现这个问题的问题,并用这个非常基本的例子重现了我的问题:
ref class bar
{
public:
System::UInt32 myint = 0;
bar(System::UInt32 in){ myint = in; }
operator System::UInt32()
{
return myint;
}
};
generic <typename T> T foo(System::UInt32 value)
{
auto t = %bar(value);
return (T) t;
}
int main()
{
//=======WORKS=======
auto t = %bar(123);
System::Console::WriteLine((System::UInt32)t);
//=======DOESN'T WORK :(=======
System::Console::Write(foo<System::UInt32>(123));
return 0;
}
运行时,此代码在到达An unhandled exception of type 'System.InvalidCastException'
中的return (T) t;
语句时会产生错误foo()
。
这段代码可以很好地处理模板,但是,由于这是在.NET环境中使用的,因此这些代码不会暴露在库之外,因此不能解决我的问题。有什么想法吗?
答案 0 :(得分:0)
有效的解决方法是在bar
中创建一个方法,该方法接收System::Type^
并返回该类型的对象,向上转换为Object^
:
ref class bar
{
public:
System::UInt32 myint = 0;
bar(System::UInt32 in){ myint = in; }
Object^ get(System::Type^ in)
{
if (in == System::UInt32::typeid)
return myint;
//Add more types here.
else return nullptr;
}
};
generic <typename T> T foo(System::UInt32 value)
{
auto t = %bar(value);
return (T)t->get(T::typeid);
}
int main()
{
System::Console::Write(foo<System::UInt32>(123));
return 0;
}
请注意,为了简洁起见,我删除了用户定义的转换函数,但如果您希望按照问题所示进行静态转换,则需要这样做。