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