機能と版画のもstd::ostreamを返しますstd::ostream?
-
23-08-2019 - |
質問
を書きたいを出力する機能もに ostream
それに渡されたきに、ストリームのようになります:
std::ostream& MyPrint(int val, std::ostream* out) {
*out << val;
return *out;
}
int main(int argc, char** argv){
std::cout << "Value: " << MyPrint(12, &std::cout) << std::endl;
return 0;
}
便利で印刷の価値をこのように、組み込み関数の呼び出しの出力をオペレーターチェーンのようになった main()
.
うまくいきませんでしたが、この版画:
$ ./a.out
12Value: 0x6013a8
ご希望の出力するこ
Value: 12
どうしたらいいですか?ないと定義 operator<<
ょうか?
更新: 明らかに何をご希望の出力となってしまいます。
UPDATE2: 一人なのか理解い印刷番号のような関数を利用しく印刷です。これは簡単な例を次に示し、実際の印刷機能の複雑なオブジェクトではなく int
.
解決
できない固定します。何もしていないなどの仕様が必要でコンパイラの評価関数呼び出しに表現は、特定の順序については関係のないオペレーターと同じ表現です。うな変化を呼び出すコードすることができず MyPrint()
評価後の std::cout << "Value: "
左から右の順に要求された表現から成る連続する複数 << 事業者のようにします。のオペレーター<< 返還のストリームが事業者連鎖の軸の一つひとつが提供する評価のオペレーター、そります。
ではできな同じことの無料通話機能がなLHS. MyPrint()
オブジェクトを返しますに等しい std::cout
, なな std::cout << "Value: "
, で効果的に行う std::cout << std::cout
, は、印刷の六角レンチ。
て希望の出力です:
Value: 12
の"権利"については、実際にオーバーライドオペレーター<<.これを頻繁に次のいずれかの操作が必要ですので、友人はいます:
class WhateverItIsYouReallyWantToPrint {
public:
void print(ostream &out) const {
// do whatever
}
};
ostream &operator<<(ostream &out, const WhateverItIsYouReallyWantToPrint &obj) {
obj.print(out);
}
場合をオーバー operator<<
のためのクラスなの適切な例がありますの複数のフォーマットするために、印刷やのときはものすごく異なる機能それぞれのがあり、それは物語を"燃え上がる炎"と題のオペレーターチェーンでの機能、または他の記複数のクラスをお取りオブジェクトとしてのコンストラクタのパラメータ、それぞれ異なるオペレータが過負荷になり.
他のヒント
したいMyPrintを持つクラスの友達のオペレーター<<:
class MyPrint
{
public:
MyPrint(int val) : val_(val) {}
friend std::ostream& operator<<(std::ostream& os, const MyPrint& mp)
{
os << mp.val_;
return os;
}
private:
int val_;
};
int main(int argc, char** argv)
{
std::cout << "Value: " << MyPrint(12) << std::endl;
return 0;
}
この方法が必要です挿入しMyPrintオブジェクトのストリームます。が必要とする機能を変更するストリームは、これを実行する事ができます。:
class MyPrint
{
public:
MyPrint(int val, std::ostream& os) : val_(val), os_(os) {}
friend std::ostream& operator<<(std::ostream& dummy, const MyPrint& mp)
{
mp.os_ << mp.val_;
return os_;
}
private:
int val_;
std::ostream& os_
};
int main(int argc, char** argv)
{
std::cout << "Value: " << MyPrint(12, std::cout) << std::endl;
return 0;
}
いる。最初は、何だき,誠にありがとうござい:
std::cout << "Value: ";
MyPrint(12, &std::cout);
std::cout << std::endl;
その他はC++のように、交換 MyPrint()
適切な std::ostream& operator<<
.が一のための int
, いただいただけ足りなくなっ
#include <iostream>
struct X {
int y;
};
// I'm not bothering passing X as a reference, because it's a
// small object
std::ostream& operator<<(std::ostream& os, const X x)
{
return os << x.y;
}
int main()
{
X x;
x.y = 5;
std::cout << x << std::endl;
}
がない期待がでの機能評価を行います。
が、特に理由を記述する必要がありますが直接のostreamはいけないと思います。ないMyPrintを返し文字列です。を利用する場合はストリーム内MyPrintの出力だけを利用strstreamを返します。
第一に、理由はありませんせる ostream
参照でポインタ:
std::ostream& MyPrint(int val, std::ostream& out) {
out << val;
return out;
}
ばねを利用したい std::ostream& operator<<(std::ostream& os, TYPE)
, 、これを実行する事ができます。:
int main(int argc, char** argv){
std::cout << "Value: ";
MyPrint(12, std::cout) << std::endl;
return 0;
}
変更後のポインタを参考に、これを実行する事ができます。:
#include <iostream>
std::ostream& MyPrint(int val, std::ostream& out) {
out << val;
return out;
}
int main(int, char**) {
MyPrint(11, std::cout << "Value: ") << std::endl;
return 0;
}
の構文 MyPrint
実質は、丸められない operator<<
が追加の引数。
このケースではその答えは明らかに:
std::cout << "Value: " << 12 << std::endl;
合う機会を設けていきたいと思いき分け以上を収めれば、教えてください何を出力したい。