我在MSDN上的某个地方读过,相当于C#的"is"关键字将是dynamic_cast,但这并不是真正等效的:它不适用于值类型或泛型参数.例如在C#中我可以写:
void MyGenericFunction<T>()
{
object x = ...
if (x is T)
...;
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试"等效"C++/CLI:
generic<class T>
void MyGenericFunction()
{
object x = ...
if (dynamic_cast<T>(x))
...;
}
Run Code Online (Sandbox Code Playgroud)
我得到一个编译器错误"错误C2682:不能使用'dynamic_cast'从'System :: Object ^'转换为'T'".
我唯一能想到的就是使用反射:
if (T::typeid->IsAssignableFrom(obj->GetType()))
Run Code Online (Sandbox Code Playgroud)
有更简单的方法吗?
Gui*_*ici 15
它在MSDN上:
简而言之,您需要编写一个这样的辅助函数:
template < class T, class U >
Boolean isinst(U u) {
return dynamic_cast< T >(u) != nullptr;
}
Run Code Online (Sandbox Code Playgroud)
并称之为:
Object ^ o = "f";
if ( isinst< String ^ >(o) )
Console::WriteLine("o is a string");
Run Code Online (Sandbox Code Playgroud)
您可以使用在本机C++中使用的safe_cast
位置dynamic_cast
并捕获System :: InvalidCastException.在兼容类型方面,询问是否可以转换类型的语义可以选择比检查标识更广泛的类型.实际上,您可能希望增加IsAssignableFrom的灵活性.
我不认为有效地相当于dynamic_cast
我们习惯的古老成语,当然没有任何紧凑的习惯.
归档时间: |
|
查看次数: |
7649 次 |
最近记录: |