-1

これが私の言いたいことです、

class V3
{
public:
float x,y,z;
};

class V3_
{
 public:
float x,y,z;
};

V3_ vec1;
V3 vec2 = static_cast<V3_>(vec1);

このキャストをコンパイル時に機能させるにはどうすればよいですか?

ありがとう。

編集:

私がやりたいことについて誤解があるようです。変換に演算子を書き込むことはできますが、コンパイル時に実行する必要があります。

static_castを許可するVector3の2つの実装を次に示します。私はそれがどのように機能するのかわかりませんが、それは機能します。

http://www.ogre3d.org/docs/api/html/OgreVector3_8h_source.html

http://harry-3d-engine.googlecode.com/svn/trunk/NxOgreVec3.h

私はこのキャストを行うことができます

 void DynamicBody::SetLinearMomentum(const Vector3& vel)
 {
body->setLinearMomentum(static_cast<NxOgre::Vec3>(vel));
 }

これを行う方法について説明したいと思います。

編集:

さらに調査したところ、実際にこれがどのように行われるかがわかりました。

template<class user_xyz_vector_type>
inline user_xyz_vector_type as() const { ... }

これは実際のstatic_castではありませんが、コンパイラーはそれを1つとして受け入れます。ポッドをお互いにキャストすることが実際のものであることを本当に望んでいました。

4

5 に答える 5

4

このキャストはいつでも機能しません。static_castタイプを完全に無関係にしたり、変換したりすることはできません。

あなたが何をしようとしているのかわからないので、この場合の作業「作業」が何を意味するのかわかりませんが、生のメモリレベルでは変換を実行できますreinterpret_cast

V3 vec2 = reinterpret_cast<V3_&>(vec1);

しかし、これは醜いハックであり、動作が保証されていません。これも、タイプが無関係であるためです。同じ程度(またはそれ以上)の成功で、memcpyあるオブジェクトを別のオブジェクトに単純に変換できます。

于 2012-07-09T18:49:45.683 に答える
1

次のようにキャストを使用することを完全に回避できます。

V3 vec2 = {vec1.x, vec1.y, vec1.z};

または、変換関数を記述します。

V3 to_V3(V3_ const & v)
{
   V3 v3 = {v.x, v.y, v.z};
   return v3;
}

そしてそれを次のように使用します:

V3 vec2 = to_V3(vec1);
于 2012-07-09T18:51:08.237 に答える
1

タイプは無関係であるため、次のものが必要ですreinterpret_cast

V3_ vec1;
V3 vec2 = reinterpret_cast<V3_&>(vec1);
于 2012-07-09T18:53:24.013 に答える
0
V3_ vec1;
V3 vec2 = *(V3*)&vec1;

編集:それでも、それはおそらく良いことではないことを知っていますか?

于 2012-07-09T18:50:47.233 に答える
0

クラス宣言 でstatic_cast V3使用V3_public:ます。。このようにして、オブジェクトを変換できます。ポリモーフィズムが必要で、自分が何をしているのかを知っている場合は、仮想デコンストラクターを使用してください。V3class V3 : public V3_

于 2012-07-09T18:57:21.917 に答える