10

std::coutへの収納に困っていstd::shared_ptr<std::ostream>ます。

これは明らかに行うべきではないため、次のようにします。

std::shared_ptr<std::ostream> p_cout(&std::cout);

std::ostream をコピーすることはできないため、これは不可能です。

std::shared_ptr<std::ostream> p_cout = std::make_shared<std::ostream>(std::cout);

誰かが法的な回避策を知っていますか?

4

3 に答える 3

15

あなたが持っている要件は奇妙ですが、もちろんstd::ostreamshared_ptr<std::ostream>提供されたポインタを格納することができます.適切なディスポーザアクションを処理します:, 例:std::shared_ptr<std::ostream>(&std::cout, [](void*) {});

于 2013-06-20T17:44:05.030 に答える
13

これは明らかにすべきではありません:

std::shared_ptr<std::ostream> p_cout(&std::cout);

実際、これは絶対に行ってはなりません。その理由は、所有権がないためstd::cout、最後shared_ptrが範囲外になると削除しようとするためstd::coutです (これは単純な悪です)。しかし、あなたはすでにそれを知っていました。

絶対に a を使用する必要がある場合shared_ptr(これは API の互換性の問題だと思います) の解決策は、何もしないカスタム デリーターを使用することです。

shared_ptr<std::ostream> p_cout(&std::cout, [](std::ostream*){});
于 2013-06-20T17:42:04.153 に答える
-1

shared_ptr は、指定したポインターの所有権を取得します。これは、プログラムが最終的に std::cout を削除しようとすることを意味します (最初の shared_ptr の最後のコピーがスコープ外になったとき)。これはあなたがしたいことではありません。

std::cout の有効期間を制御する必要がないため、std::ostream の生のポインターまたは参照を渡すだけで済みます。

于 2013-06-20T17:40:24.687 に答える