私は最終的に C ++プログラムのレベルで前方互換性と後方互換性を維持しながら、最終的にはライブラリツールキットを作成する必要があり、リリースの準備を進めていましたが、すでにリリースされています。一般に、機能(構文によってはエミュレートできないものもあります)でも構文でも「完全な」前方互換性が得られないことを受け入れる限り(おそらく、マクロ、代替名前空間を使用する必要があります)いくつかの事柄)その後、あなたはすべて設定されています。
実際に使用するのに十分なレベルでC ++ 03でエミュレートできる多くの機能があります。たとえば、Boostなどの煩わしさはありません。ヘック、C ++標準の提案でさえ、nullptr
C ++ 03バックポートを提案しています。そして、たとえば、C ++ 11でありながら過去数年間のプレビューを行ったものすべてにTR1があります。それだけでなく、アサートバリアント、透過ファンクタなどのC ++ 14機能の一部は、C ++ 03で実装optional
できます。
絶対にバックポートできないことを私が知っているのは、constexprとvariadicテンプレートの2つだけです。
ものを名前空間に追加すること全体の問題に関してstd
、私の見解では、それは問題ではないということです -まったく。最も重要で関連性の高いC ++ライブラリの1つであるBoostと、TR1:Boost.Tr1の実装について考えてみましょう。C ++を改善したい場合は、C ++ 11との前方互換性を確保し、定義によりC ++ 03ではないものに変えているので、回避するかまたは残す予定の標準をブロックすることは、簡単に言えば、逆効果です。純粋主義者は文句を言うでしょうが、定義上、それらを気にする必要はありません。
もちろん、結局(03)標準に従わないからといって、それを試みることができない、または喜んでそれを破るつもりはありません。それはポイントではありません。std
名前空間に何を追加するかについて非常に慎重に制御し、ソフトウェアが使用される環境を制御する(つまり、テストを行う)限り、処理できない害はまったくありません。可能であれば、すべてを個別のネームスペースで定義し、using
ディレクティブをネームスペースに追加するだけで、std
「絶対に」入力する必要があるものを超えて追加することはありません。
更新(2013):元の質問のリクエストとして、担当者がいないために追加できないコメントの一部を見ると、C ++ 11およびC ++ 14の機能とそれらの移植性の程度のリストがありますC ++ 03へ:
nullptr
:公式委員会のバックポートを考慮して完全に実装可能。「ネイティブ」タイプとして認識されるように、おそらくtype_traitsの特殊化も提供する必要があります。
forward_list
:アロケータのサポートは、Tr1実装が提供できるものに依存しますが、完全に実装可能です。
- 新しいアルゴリズム(partition_copyなど):完全に実装可能。
- 括弧シーケンスからのコンテナ構造(例:)
vector<int> v = {1, 2, 3, 4};
:完全に実装可能ですが、必要以上に冗長です。
static_assert
:マクロとして実装された場合、ほぼ完全に実装可能です(コンマだけに注意する必要があります)。
unique_ptr
:ほぼ完全に実装可能ですが、呼び出しコードからのサポートも必要になります(コンテナなどに保存するため)。ただし、以下を参照してください。
- 右辺値参照:どれだけの値を取得するかによって、ほぼ完全に実装可能です(例:Boost Move)。
- Foreach反復:ほぼ完全に実装可能で、構文は多少異なります。
- 引数としてローカル関数を使用する(例:変換):ほぼ完全に実装可能ですが、構文は十分に異なります-たとえば、ローカル関数は呼び出しサイトで定義されず、直前に定義されます。
- 明示的な変換演算子:実用的なレベルに実装可能(変換を明示的にする)、Imperfect C ++の「explicit_cast」を参照してください。しかし、
static_cast<>
ほとんど不可能なような言語機能との統合。
- 引数の転送:上記の右辺値参照で与えられる実用的なレベルまで実装可能ですが、転送可能な引数を取る関数にN個のオーバーロードを提供する必要があります。
- move:実用レベルまで実装可能(上記2つを参照)。もちろん、これから利益を得るには、修飾子コンテナとオブジェクトを使用する必要があります。
- スコープ付きアロケーター:Tr1実装が支援しない限り、実際には実装できません。
- マルチバイト文字タイプ:Tr1がサポートしない限り、実際には実装できません。ただし、C ++ 11を使用している場合でも、意図した目的のために、ICUなどの問題を処理するために特別に設計されたライブラリに依存する方が適切です。
- 可変引数リスト:いくつかの手間をかけずに実装可能で、引数の転送に注意してください。
noexcept
:コンパイラの機能に依存します。
- 新しい
auto
セマンティクスとdecltype
:は、コンパイラの機能に依存します-例:__typeof__
。
- サイズの整数型(
int16_t
など):コンパイラの機能に依存します-または、ポータブルstdint.hに委任できます。
- 型属性:コンパイラの機能に依存します。
- 初期化子リスト:私の知る限りでは実装できません。ただし、コンテナをシーケンスで初期化する場合は、「コンテナの構築」に関する上記を参照してください。
- テンプレートのエイリアシング:私の知る限りでは実装できませんが、とにかく不要な機能であり
::type
、テンプレートには永遠にあります
- 可変長テンプレート:私の知る限り実装できません。closeは、テンプレート引数のデフォルト設定であり、Nの専門化などが必要です。
constexpr
:私の知る限りでは実装できません。
- 均一な初期化:私の知る限りでは実装できませんが、デフォルトの -constructorの初期化は、Boostのvalue-initializedで実装できます。
- C ++ 14
dynarray
:完全に実装可能。
- C ++ 14
optional<>
:C ++ 03コンパイラがアライメント設定をサポートしている限り、ほぼ完全に実装可能です。
- C ++ 14透過ファンクタ:ほぼ完全に実装可能ですが、クライアントコードは、たとえば
std::less<void>
、動作させるために明示的にeg .: を使用する必要があります。
- C ++ 14の新しいアサートが(のようなバリアント
assure
):完全に実現可能な、あなたがしたい場合は、有効にしたい場合は代わりにスロー近く、完全に実装可能な、主張しています。
- C ++ 14タプル拡張(タプル要素をタイプ別に取得):完全に実装可能であり、機能提案で説明されている正確なケースでコンパイルに失敗することさえあります。
(免責事項:これらの機能のいくつかは、上でリンクしたC ++バックポートライブラリに実装されているので、「完全に」または「ほぼ完全に」と言ったときに何を言っているか知っていると思います。)