3

ゲーム用に開発しているマルチプラットフォーム エンジンは、メモリ、パフォーマンス、および移植性の理由から、STL を置き換えるために EASTL を使用しています。EASTL は次の場所にあります:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html

Visual Studio は STL のデバッグに非常に適しているため、エンジンの開発中は Windows で EASTL を使用していません。また、std::queue、std::deque などの一部の STL コンテナーは、EASTL では使用できません。Windows でも Eastl::string を使用していることは問題ではありません。これはデバッグに適しているためです。

私たちが今までやってきたことは、

#if (GIN_USE_EASTL)
    #define ginstl eastl
#else
    #define ginstl std
#endif

GIN_USE_EASTL は Windows では 0 として定義されます。エンジンはGinkgoと呼ばれ、GINの由来です。
リスト、ベクターなどを使用しています...このように

ginstl::list myList;
ginstl::vector myVector;

これは非常にうまく機能します。しかし、文字列またはキューを使用する場合、上で説明した理由により、次のように記述する必要があります。

eastl::string myString;
std::queue myQueue;

これが最適ではないため、ここに投稿する理由です! 私がやりたいことは、どの実装を使用するかを考えずに、エンジン内のすべてに ginstl:: マクロを使用することです。したがって、この問題に対する私のアプローチは次のとおりです。

#if (GIN_USE_EASTL)
    #define ginstl::list eastl::list
    #define ginstl::vector eastl::vector
    #define ginstl::string eastl::string
    #define ginstl::queue std::queue
#else
    #define ginstl::list std::list
    #define ginstl::vector std::vector
    #define ginstl::string eastl::string
    #define ginstl::queue std::queue
#endif

しかし残念なことに、#define マクロでは :: が許可されていないため、これは機能しません。同じことを達成する方法はありますか (特定のデータ構造に使用する実装を指定することができます)、どういうわけか異なる方法はありますか? 私は行くことができました

#define ginstl_list eastl::list

しかし、私は上からの構造を好むでしょう! この問題を回避する方法 (カスタム プリプロセッサを作成する以外) はありますか?

4

3 に答える 3

6

どうですかusing namespace:

namespace ginstl
{
#if (GIN_USE_EASTL)
    using eastl::list
    using eastl::vector
    using eastl::string
    using std::queue
#else
    using std::list
    using std::vector
    using eastl::string
    using std::queue
#endif
}
于 2012-01-06T18:35:44.853 に答える
5

マーク B の方法でさらに開発します (使用されるすべてのタイプをリストする必要はありません):

namespace ginstl
{
#if (GIN_USE_EASTL)
    using namespace eastl;
#else
    using namespace std;
#endif
    using eastl::string
    using std::queue
}
于 2012-01-06T18:43:14.910 に答える
3

マクロの代わりに名前空間エイリアスを使用する場合:

#if (GIN_USE_EASTL)
    namespace ginstl = eastl;
#else
    namespace ginstl = std;
#endif

その後、これを行うことができます:

using namespace ginstl;
using std::queue;
using std::deque;

list<int> x; // from eastl or std, depending on GIN_USE_EASTL
queue<int> y; // always from std
于 2012-01-06T18:50:47.993 に答える