Проверьте, какой дочерний класс является родительским объектом - PullRequest
0 голосов
/ 05 мая 2018

У нас есть метод, которому передается класс в качестве аргумента. Этот класс имеет разные дочерние классы. Нам нужно знать, какой из этих классов передается в качестве аргумента этому методу. Мы не можем определить один метод для каждого из возможных классов из-за требований присваивания. Кроме того, если дочерний класс не поддерживается этим методом, ошибка должна быть сгенерирована во время компиляции. Мы пытались сделать это с помощью static_cast, но мы не получаем требуемых результатов, поскольку преобразование между двумя дочерними классами всегда возможно.

class A{
...
};

class B : public A{
...
};

class C : public A{
...
}

void foo(A a){
    if(a is B){
        //OK and do stuff
    }else if(a is C){
        //throw compile error
    }
}

1 Ответ

0 голосов
/ 05 мая 2018

Вы можете написать foo в качестве шаблона для выполнения всех проверок во время компиляции:

#include <type_traits>

template<class T>
void foo(T t)
{
  static_assert(std::is_same<T, C>::value == false,
                "foo() must not be invoked with object of class C");
  if (std::is_same<T, B>::value) {
    // do stuff
  }
}

static_assert используется для проверки некоторых условий во время компиляции, а std::is_same сравнивает два типа во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...