2016-06-24 14 views
2

私はdoubleのいくつかのポイントを持っています。 0でないときにのみストリームに書きたいと思います。3進演算子を使用してストリームに書き込む? C++で

はこのようにそれを行うにはどのような方法があります。..

x1=" value "

y1=" value "など:

<< ((x1 != 0) ? ("x1=\"" << x1 << '"') : ' ')) 
    << ((y1 != 0) ? ("y1=\"" << y1 << '"') : ' ')) 

またはまた、私はこのように、それはどちらと言っていますifelseステートメントをいくつか作る必要がありますか?

+1

あなたはこれと得望ましくない動作を実行しようとしたことがありますか?それは私にはうまく見えます....疑問に思ったときにプッシュ再生して、それが動作するかどうかを確認してください.... – Assimilater

+0

実際には、問題があります。これは、三項式の一部として<< "x1 <<" "です。 – Assimilater

+0

' ( "x1 = \" "<< x1 << '"') 'が正しくありません。あなたはそれをすることはできません。 –

答えて

3

doubleというグループのグループがある場合は、それらをループすることを検討することをお勧めします。これは「いくつかのif-elseステートメント」からの改善です。あなたが反復処理することができ、アレイまたはその他のオブジェクトに入れて:すなわち:

// Example using 10 elements 
#define N 10 
double nums[N]; 
// ... code 
for (int i = 0; i < N; ++i) { 
    if (nums[i] != 0) { 
     cout << "nums[" << i << "]=\"" << nums[i] << "\""; 
    } 
} 

多分これである理由を明確に役立つように、関数呼び出し(基本的に何がボンネットの下に起こっている)として、各<<を壊す考えてみます。

(((std::cout << "string1") << 10) << std::endl); 

std::cout << "string1"

これは、連続を使用することができるという「連鎖」効果を可能にするようなものに解決オペレータは、各オペレータコールが同じostreamに解決されるため、オペレータがを呼び出します。

6

コードは次のように動作しません。 ?:演算子の2つのオペランドは、同じデータ型に評価する必要があります。あなたの例で:

  • 左のオペランドは有効なコードでもありません。 のような式は、doubleまたはcharを文字列リテラル(const char[]に相当)にストリーミングできないため、無効です。しかし、有効なコードであれば、std::ostream&と評価され、これは<<演算子の標準出力タイプです。

  • 右オペランドはcharです。彼らはタイプが一致していないので

、あなたは?:を使用することはできません。代わりにifステートメントを使用してコードを分割する必要があります:あなたはstd::ostreamのように、左側のストリーミングオブジェクトに添付されていない式の一部として<<演算子を使用することはできません

if (x1 != 0) 
    mystream << "x1=\"" << x1 << '"'; 
else 
    mystream << ' '; 

if (y1 != 0) 
    mystream << "y1=\"" << y1 << '"'; 
else 
    mystream << ' '; 
+2

'(" x1 = \ "" << x1 << '' ') 'は単独での式ですが、正しくありません。文字列リテラルと 'double'の間で' << 'を使うことはできません。 –

+0

@RSahuこの回答はparenthasisを使用しないので、私の答えのようなものに解決されます。 @Assimilater、 – Assimilater

+1

私はOPの質問のコードについて話していた。 –

1

あなたはラムダを取っストリームマニピュレータを呼び出すことができる:

#include <functional> 
#include <iostream> 

struct Manipulator { 
    using function_type = std::function<void (std::ostream&)>; 
    function_type function; 
    Manipulator(function_type function) : function(function) {} 
}; 

inline std::ostream& operator << (std::ostream& stream, const Manipulator& manipulator) { 
    manipulator.function(stream); 
    return stream; 
} 

int main() { 
    int a = 0; 
    int b = 1; 
    std::cout 
     << Manipulator([a](std::ostream& stream) { if(a) stream << "a=\"" << a << '"'; }) 
     << Manipulator([b](std::ostream& stream) { if(b) stream << "b=\"" << b << '"'; }) 
     << '\n'; 
} 

注:C++ 14の一般化ラムダキャプチャauto&によってstd::ostream&を置き換えることができます。ここ

+0

おそらくちょっと残虐ですが、あなたは*そのようなことをすることができます...多分私の頭の上から何も考えることはできませんが、状況によっては役に立つかもしれません – Assimilater

0

あなたはこのようにラムダを使用することができます@DieterLückingのアプローチ

のバージョンを短縮:

#include <iostream> 

int main() 
{ 
    int a = 0; 
    int b = 1; 
    [](std::ostream& stream, int x)->std::ostream& { if(x) stream << "b=\"" << x << '"'; return stream;}(std::cout, a); 
    [](std::ostream& stream, int x)->std::ostream& { if(x) stream << "b=\"" << x << '"'; return stream;}(std::cout, b) << std::endl; 
} 
関連する問題