архитектура — Сравнение типов в переполнении стека

Я работаю над пользовательским движком, где у меня есть 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));
}

-1

Решение

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

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.

6

Другие решения

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

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

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

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

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

1

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

#define USING_CLASS_2D 1

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

if (USING_CLASS_2D)
{
}
else
{
}
0