10

多かれ少なかれ、タイトルが示唆するもの。私はまだ C++0xを使用していませんが、それが起こったときに備えたいと思います。また、その機能の一部を使用するために書き直さなければならないコードの量を減らしたいと考えています。そうすれば、後方互換性と前方互換性を一度に取得できます。

私が見つけた最も興味深いものの 1 つは で、nullptr最近頻繁に使用しています。

「公式の回避策」とMeyer の提案を確認した後、これを自分の C++ プログラムと将来の C++0x プログラムの両方で使用することにしました。2 番目の部分は単純です。キーワードであるため、nullptr単純にサポートされます。しかし、最初の部分は私に不快感を与えています。

Meyers の提案は次のように機能します。

class nullptr_t { // ← this is my issue
    // definition of nullptr_t
} nullptr = { };

std::nullptr_tその提案の問題点は、C++0x で必要とされる型を宣言することです。つまり、回避策を「ネイティブに感じる」には、std::名前空間を再度開いて型を追加する必要があります。私は、C ++プログラムで行うのは違法であることを理解しています(明らかに警告を発して眉をひそめているように見える特殊化を追加するのとは異なります)。

C++ プログラムでnullptr快適かつ合法的な方法で使用したい。私が考えていたオプションの 1 つは、別の名前空間で型を宣言し、それを次のように使用することでしたusing

namespace mylibrary {
class nullptr_t {
    ....
} nullptr = { };
// end namespace
}

// These would have to go in the header file.
using mylibrary::nullptr;
using mylibrary::nullptr_t; // apparently this is necessary as well?

これはそれを機能させる正しい方法でしょうか?ディレクティブを強制usingし、特定の順序の#includeディレクティブも強制します。nullptr_tC++0x より前のコードでは、名前空間を持つ型を (たとえば、関数の引数の型として)要求しないと期待するのは正しいでしょうか? このようにすると、実際に「ネイティブ感」が得られるでしょうか?


補足として、互換性とコーディングを改善するために、いくつかの気の利いた C++0x のものを C++ にバックポートしようとすることは、歓迎されることですか、それとも嫌われることですか? それまでの間、私はこのソリューションと、私が取り組んでいる他のソリューションを、リリースされるソフトウェアに統合しました。

4

2 に答える 2

3

タイプの別のオブジェクトを宣言する必要がある理由を考えられない限りnullptr_t(私にはできません)、タイプを非表示にnullptrしてグローバル名前空間に配置し、キーワードをできるだけ厳密に模倣します。

namespace mylibrary
{
    class nullptr_t
    {
        ....
    };
}

mylibrary::nullptr_t nullptr = { };
于 2012-01-05T18:21:07.450 に答える
1

ものを追加できない主な理由namespace stdは、すでにあるものを台無しにしないためです。これは、そうでなければ簡単に行うことができます。私が過去に見つけたのは、 のような組み込み型でインスタンス化されたコンテナーの出力演算子の複数の定義ですstd::vector<int>。ただし、nullptr_tこの名前空間では定義されていないため、 a を追加してtypedefも害はありません。つまりnullptr_t、別の名前空間で定義し、 forを to にnamespace std追加します。C++2011 では修飾なしで使用されるため、変数はグローバル スコープで宣言する必要があります。typedefnullptr_tnamespace stdnullptr

タイプstd::nullptr_tが必要かどうかは、このタイプを使用して署名を追加することに関心があるかどうかによって異なります。たとえば、std::shared_ptr<T>と比較できますnullptr。このためには、型に言及するstd::nullptr_t(またはこの型に別の名前を使用する) 適切なオーバーロードを追加する必要があります。

于 2012-01-05T20:01:16.197 に答える