10

GCC と MSVC の最新バージョンに同梱されている TR1 ライブラリを使用したいのですが、微妙な違いがあります。GCC では、

#include <tr1/memory>
std::tr1::shared_ptr<int> X;

MSVCにいる間、私は言わなければなりません

#include <memory>
std::shared_ptr<int> X;

2 つの質問があります。1) MSVC は C++0x モード (GCC の std=c++0x と同等) で自動的に動作しますか、それともデフォルトで C++98/03 モードでも動作しますか? 2) インクルードと名前空間を統合するにはどうすればよいですか? 「INCLUDE_TR1(memory)」などのプリプロセッサ マクロについて考えていました。

明確にするために、従来の標準 C++98/03 を使用したいと思います。C++0x ではありません (そうでなければ問題ありません)。

どんな提案でも大歓迎です!

4

4 に答える 4

4
  1. VC++ 2010は C++0x モードでのみ動作します。以前のバージョンには C++0x のサポートがありませんでした。とはいえ、VC++ 2010 の標準ライブラリの多くは、依然として TR1 に基づいています (たとえば、TR1 ベースstd::result_of<>ではなく、TR1 result_of プロトコルを使用していますdecltype)。実際、VC++ 2010 の標準ライブラリの多くは実際には namespacestdではなく、namespace で定義されており、using ディレクティブを使用しstd::tr1て名前空間に取り込まれています。std
  2. ブーストを使用します。TR1 --#includeプラットフォームに応じて適切なヘッダーになります。または、プラットフォームに TR1 サポートがない場合は、対応する Boost 実装を使用して宣言を使用#includeして名前空間にプルします。std::tr1
于 2011-05-10T15:39:16.530 に答える
4

VC++ 2010は常にC++0x モードで動作しますが、クラスはstd std::tr1名前空間の両方に存在します。#if _MSC_VER含めるヘッダーを選択するには、コンパイラを検出する必要があります (この回答を参照してください)。

Boost.TR1ライブラリは、コンパイラのヘッダーを自動的にインクルードし、Boost を使用して不足している機能を埋めることができますそれは役立つかもしれません。

于 2011-05-10T15:41:23.217 に答える
2

特に GCC のネイティブ TR1 ライブラリを使用しようとしたときに、Boost.TR1 でいくつかの矛盾した克服できない問題が発生した後、Boost を完全に捨てて、小さな #define 回避策を使用することにしました。ここに私の「tr1.h」があります:

#ifndef _TR1_INCLUDE_H
#define _TR1_INCLUDE_H

/** Usage: #include TR1INCLUDE(unordered_map)
 **
 ** Configuration: Define HAVE_TR1_SUBDIR if you need #include <tr1/unordered_map>; otherwise we take #include <unordered_map>.
 **
 **/

#define QUOTE(arg) <arg>

#ifdef HAVE_TR1_SUBDIR
#  define TR1IFY(arg) tr1/arg
#else
#  define TR1IFY(arg) arg
#endif

#define TR1INCLUDE(arg) QUOTE(TR1IFY(arg))

#endif

これで、次のようにプログラムを書くことができます。

#include "tr1.h"
#include TR1INCLUDE(unordered_map)
于 2011-05-10T21:17:17.240 に答える
1

MSVC のさまざまなバージョンには、それぞれの機能があります。それらをオンまたはオフにする方法はありません。

一部の機能には、tr1 バージョンと std バージョンの両方が含まれている場合もあります。少し異なるセマンティクスで!

于 2011-05-10T15:39:53.673 に答える