Сравнение типов в C++

Я работаю над пользовательским движком, где у меня есть 2 разных класса преобразования, один для 2D и один для 3D. Я использую #define, чтобы выбрать, какой класс преобразования использовать, и использую это определение вместо имени класса в местах, где логика должна быть одинаковой. Сейчас я нахожусь в той части, где я хочу, чтобы у них была другая логика, и хотел сделать сравнение, чтобы уйти от этого. Что мне нужно сделать, чтобы заставить это работать?

class Transform2D;
class Transform3D;

#define TransformClass Transform2D

if(TransformClass == Transform2D)
{
  //like this
}
else    
{
  //like that
}

Тип ID работал для этого. Как вы справляетесь?

if ( typeid(TransformClass) == typeid(Transform2D) )
{
    ittransform->SetRotation(0);
    ittransform->SetScale(Vector2D(defaultScale, defaultScale));
}
else
{
    ittransform->SetRotation(Vector3f());
    ittransform->SetScale(Vector3f(defaultScale, defaultScale, defaultScale));
}

3 ответа

Используйте декомпозицию функций (разбейте свою логику на подфункции), а затем используйте перегрузку.

void do_something(Transform2D const& t) {
  ...
}

void do_something(Transform3D const& t) {
  ...
}

void test() {
  TransformClass tc = ...
  do_something(tc); // invokes the desired overload
}

Кроме того, используйте определение типа или псевдоним типа вместо определения, например

#if defined(USE_3D)
using TransformClass = Transform3D;
#else
using TransformClass = Transform2D;
#endif

Вы также можете определить псевдоним через std::conditional и быть еще более функциональным-y и C++-y.

Не используйте if() в этой ситуации.

Поскольку вы кодируете с помощью препроцессора, придерживайтесь его:

# if USING_3D
    3d code
# else
    2d code
# endif

и если вы будете стремиться к тому, чтобы большинство методов и вспомогательных классов выглядели одинаково, вам, вероятно, удастся избежать чрезмерного использования #if

Старый код C был завален этим материалом и считался хорошим. Однако в наши дни это очень старомодно. Подумай трижды, прежде чем идти по этому пути.

Я думаю, что самый простой вариант - создать дополнительное определение, примерно так:

#define USING_CLASS_2D 1

#if USING_CLASS_2D
#define TransformClass Transform2D
#else
#define TransformClass Transform3D
#endif

if (USING_CLASS_2D)
{
}
else
{
}
Другие вопросы по тегам