Как написать эквивалент Delphi «есть» и «как» в C ++ Builder? - PullRequest
0 голосов
/ 08 октября 2018

Я хочу написать функцию (или даже оператор, если это возможно), которая делает что-то похожее на "is" Delphi.Пример 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?

1 Ответ

0 голосов
/ 08 октября 2018

Q: Как я могу заставить функцию принимать любые типы объектов для 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";
}

С учетом сказанного я советую вам избегать создания такой функции по двум причинам:

  1. ВыМожно просто использовать динамический_каст в другом месте, он более идиоматичен и показывает стоимость, которую вы платите за такую ​​проверку
  2. Проверка для определенного типа в целом является признаком некорректного дизайна.Бывают случаи, когда это необходимо, но это редко, и в целом мое личное мнение таково, что вообще не следует мириться с этим, что бы сделала такая функция.
...