通过通用方法访问的用户定义转换函数的运行时错误

时间:2014-10-15 18:47:40

标签: .net generics c++-cli

我正在尝试实现一个在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环境中使用的,因此这些代码不会暴露在库之外,因此不能解决我的问题。有什么想法吗?

1 个答案:

答案 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;
}

请注意,为了简洁起见,我删除了用户定义的转换函数,但如果您希望按照问题所示进行静态转换,则需要这样做。