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