-1

私は、2D 用と 3D 用の 2 つの異なる変換クラスを持つカスタム エンジンに取り組んでいます。#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));
}
4

3 に答える 3

6

関数分解 (ロジックをサブ関数に分割) を使用してから、オーバーロードを利用します。

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

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

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

また、定義の代わりに typedef または型エイリアスを使用します。

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

std::conditional を介してエイリアスを定義することもでき、さらに機能的で C++ 的になります。

于 2014-09-10T22:42:30.757 に答える
1

この状況では if() を使用しないでください。

プリプロセッサを使用してコーディングしているため、それに固執します。

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

そして、ほとんどのメソッドと補助クラスを大まかに同じに保つように努めれば、#if の過度の使用を避けることができるでしょう。

古い C コードにはこのようなものが散らばっていましたが、それは優れていると考えられていました。しかし、今日では、それは非常に古い方法です。この道を進む前に、よく考えてください。

于 2014-09-11T00:03:01.203 に答える
0

最も簡単なオプションは、次のような追加の定義を作成することだと思います。

#define USING_CLASS_2D 1

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

if (USING_CLASS_2D)
{
}
else
{
}
于 2014-09-10T22:43:23.940 に答える