1

とを含むクラスがありますstd::ofstreamstd::ifstream一度にアクティブにできるのは1つだけです)。operator()現在アクティブなストリームを返すためにをオーバーロードしたいと思います。しかし、共通のベースタイプは何でありstd::ofstreamstd::ifstream共通の参照を返すのでしょうか?

4

2 に答える 2

2

現在のアクティブなストリームを返すためにoperator()をオーバーロードしたいこれはまったく意味がなく、設計上の欠陥のようなにおいがします。なぜあなたはそれを返したいのですか?その演算子の呼び出し元は、戻り値で何ができる必要がありますか?入力も出力もできません。

あなたが本当にやりたいことはわかりませんが、危険ですが、おそらくこのようなものがあなたのために働く可能性があります

template<typename T> class wrapper
{
  T*const ptr;
  wrapper(T*p) : ptr(p) {}
public:
  bool empty() const { return ptr; }
  operator T& () const
  {
    if(empty()) throw some_exception("trying to use empty wrapper");
    return *ptr;
  }
  friend some_class;
};

class some_class
{
   ifstream _ifstream;
   ofstream _ofstream;
   bool ifstream_is_active;
   bool ofstream_is_active;
public:
   operator wrapper<ifstream> () const
   { wrapper<ifstream>(ifstream_is_active? &_ifstream : 0); }
   operator wrapper<ofstream> () const
   { wrapper<ofstream>(ofstream_is_active? &_ofstream : 0); }
};

ただし、ダングリングポインタを処理している可能性があるため、これは危険です。shared_ptr(これを自分で解決する)を使用することでそれを回避できますが、それsome_classはこれらのストリームの存続期間を制御できなくなることを意味します。

于 2012-09-27T17:11:55.247 に答える
1

入力ストリームと出力ストリームは非常に異なるタイプです。それらが共有する唯一の共通基本クラスはですstd::ios。そして、それはいくつかのエラーチェックのものを除いてそれには多くを持っていません。

2つのストリームタイプは、最も基本的なインターフェイスのみを共有します。明らかな理由から、それらは互いにほとんど関係がありません。

于 2012-09-27T15:56:48.083 に答える