2016-12-28 8 views
0

我々はCINで使うように:抽出演算子を使用してC++でクラスのメソッドから複数の値を取得する方法は?

cin >> a >> b; 

入力ストリームから複数の値を取得し、複数の変数にそれらを挿入します。 このメソッドを独自のクラスでどのように実装できますか?そこから複数の値を取得する。

#include <iostream> 
using namespace std; 

class example { 
    friend istream& operator>> (istream& is, example& exam); 
    private: 
     int my = 2; 
     int my2 = 4; 
}; 

istream& operator>> (istream& is, example& exam) { 
    is >> exam.my >> exam.my2; 
    return is; 
} 

int main() { 
    example abc; 
    int s, t; 

    abc >> s >> t; 
    cout << s << t; 
} 

しかし、取得エラー「演算子の一致なし>>(オペランドの型は 『例』と 'int型です)」

PSは:私は別の方法を知っているが、 は、私が見つかりました。hereとしてこれを試してみました私はこれを行うこの具体的な方法を知りたい、ありがとう。

答えて

0

定義した挿入演算子は、自分のクラスではなく、std::istreamをソースとして使用します。私はあなたの目的が悪いと思っていますが、あなたのクラスに似た演算子を作ることができます。チェーン演算子が異なる値を抽出する必要があるため、適切な状態のエンティティが必要です。

私はセットアップ生産の任意の並べ替えのためにこれを使用することはありませんが、それは確かに行うことができます。

#include <iostream> 
#include <tuple> 
using namespace std; 

template <int Index, typename... T> 
class extractor { 
    std::tuple<T const&...> values; 
public: 
    extractor(std::tuple<T const&...> values): values(values) {} 
    template <typename A> 
    extractor<Index + 1, T...> operator>> (A& arg) { 
     arg = std::get<Index>(values); 
     return extractor<Index + 1, T...>{ values }; 
    } 
}; 

template <typename... T> 
extractor<0, T...> make_extractor(T const&... values) { 
    return extractor<0, T...>(std::tie(values...)); 
} 

class example { 
private: 
    int my = 2; 
    int my2 = 4; 
    double my3 = 3.14; 
public: 
    template <typename A> 
    extractor<0, int, double> operator>> (A& arg) { 
     arg = my; 
     return make_extractor(this->my2, this->my3); 
    } 
}; 

int main() { 
    example abc; 
    int s, t; 
    double x; 

    abc >> s >> t >> x; 
    cout << s << " " << t << " " << x << "\n"; 
} 
+0

おかげで多くのことを。どのようにプログラミングでこれが良いアイデアではない理解していますが、私はちょうどそれを知っている衝動があったし、1時間以来検索していた。 –

1

exampleのデータをintに抽出します。代わりに、istreamからexampleにデータを抽出するコードを書いています。だから、正しい機能が見つからないのです。あなたはそれを書いていませんでした。

あなたは本当にabc >> s >> tが動作するように許可したい場合は、operator>>(example&, int&)を定義し、あなたのクラスにストリーム/カーソルのセマンティクスを追加し、これまでに抽出されているものの各ステップで追跡するためにする必要があるとしています。それは本当に価値があるよりも多くのトラブルのように聞こえる。

関連する問題