如何在 C++ Builder 中编写 Delphi "is" 和 "as" 的等价物?
How to write equivalent of Delphi "is" and "as" in C++ Builder?
我想编写一个函数(如果可能的话,甚至是一个运算符),其功能类似于 Delphi 的 "is"。
Delphi 示例:
if Sender is TMenuItem then
TMenuItem(Sender)->Enabled = false;
因此,在 C++ 中 Builder 这将类似于:
bool Is(*p1, *p2)
{
p = dynamic_cast<p1*>(p2); //here we typecast TObject to TMenuItem
if (!!p)
{
return true;
}
else return false;
}
如何让函数接受 p1、p2 的任何类型的对象?
问:如何让函数接受 p1、p2 的任何类型的对象?
A: 使用模板,像这样:
template<typename T, typename PtrType>
bool IsA(PtrType *ptr)
{
return dynamic_cast<T*>(ptr) != nullptr;
}
像这样使用模板函数:
A* obj = new C();
if (IsA<C>(obj))
{
std::cout << "obj is of type C";
}
话虽如此,我建议您避免创建这样的函数,原因有两个:
- 你可以只使用 dynamic_cast everywhere,它更加地道,并显示你为进行这种检查所支付的费用
- 检查特定类型通常是设计有缺陷的标志。在某些情况下需要它,但这种情况很少见,总的来说我个人的意见是一般不应该宽恕它,这样的功能就可以了。
我想编写一个函数(如果可能的话,甚至是一个运算符),其功能类似于 Delphi 的 "is"。 Delphi 示例:
if Sender is TMenuItem then
TMenuItem(Sender)->Enabled = false;
因此,在 C++ 中 Builder 这将类似于:
bool Is(*p1, *p2)
{
p = dynamic_cast<p1*>(p2); //here we typecast TObject to TMenuItem
if (!!p)
{
return true;
}
else return false;
}
如何让函数接受 p1、p2 的任何类型的对象?
问:如何让函数接受 p1、p2 的任何类型的对象?
A: 使用模板,像这样:
template<typename T, typename PtrType>
bool IsA(PtrType *ptr)
{
return dynamic_cast<T*>(ptr) != nullptr;
}
像这样使用模板函数:
A* obj = new C();
if (IsA<C>(obj))
{
std::cout << "obj is of type C";
}
话虽如此,我建议您避免创建这样的函数,原因有两个:
- 你可以只使用 dynamic_cast everywhere,它更加地道,并显示你为进行这种检查所支付的费用
- 检查特定类型通常是设计有缺陷的标志。在某些情况下需要它,但这种情况很少见,总的来说我个人的意见是一般不应该宽恕它,这样的功能就可以了。