0

以下は、 のセマンティクスを変更して共有ポインタを実装する試みですoperator==

template <typename T>
struct deref_shared_ptr: private std::shared_ptr<T> {
    using Base = std::shared_ptr<T>;
    // ... using statements to include functionality from the base.

    bool operator==(const deref_shared_ptr rhs) const {
        return (**this == *rhs);
    }
};

std::make_sharedこのタイプに相当するものを実装するのに苦労しています。これは私の試みです:

template< class T, class... Args >
deref_shared_ptr<T> make_deref_shared( Args&&... args ) {
    return reinterpret_cast<deref_shared_ptr<T>>(std::make_shared<T>(args...));
}

これは機能しません: コンパイラ ( g++ 5.4.0) は無効なキャストについて文句を言います。なぜ機能しないのですか? このキャストの代わりに何をすべきですか?

4

2 に答える 2

2

このコンパイラ エラー メッセージが表示されるのreinterpret_castは、プライベート継承を介してキャストを行うことができないためです。このトピックに関する次のテーマを確認してください: c++ キャストの違い、cスタイルのキャストのみで処理できる変換

継承を通過する唯一の方法privateは、C スタイルのキャストです。したがって、次のように例を変更すると、例が機能します。

template< class T, class... Args >
deref_shared_ptr<T> make_deref_shared(Args&&... args) {
    return (deref_shared_ptr<T>)(std::make_shared<T>(args...));
}

c スタイルのキャストは、多重継承の場合やその他の場合に正しく機能しない可能性があるため、一般的なケースでは安全ではありませんが、この場合は安全です。

于 2016-07-31T08:21:03.180 に答える