2016-01-28 13 views
15

一時的なvalarrayを繰り返し処理したいのですが、機能しません。 C++の範囲ベースのループオーバーvalarray rvalueは機能しません。

#include <iostream> 
#include <valarray> 
int main() 
{ 
     using namespace std; 
     valarray<int> numerators = {99, 26, 25}; 
     valarray<int> denominators = {9, 2, 5}; 
     for (int i : numerators/denominators) { cout << i << ","; } 
     // lots of errors 
     return 0; 
} 

以下は私が temp_arrayのようなオブジェクトを定義しないことを除いて、達成したいものの最小限の作業例です。ここに私の(非稼働)のコードです。

#include <iostream> 
#include <valarray> 
int main() 
{ 
     using namespace std; 
     valarray<int> numerators = {99, 26, 25}; 
     valarray<int> denominators = {9, 2, 5}; 
     valarray<int> && temp_array = numerators/denominators; 
     for (int i : temp_array) { cout << i << ","; } 
     // prints 11,13,5, 
     return 0; 
} 

マイコンパイラはg ++バージョン4.8.5(Red Hat 4.8.5-4)です。 -std = C++ 0xフラグを付けてコンパイルしています。

for (auto&& i : temp_array)for (int const & i : temp_array)などの他の構文を試しましたが、動作しません。 (また、単一の式でこれを行うには公式の方法を含んでいる)のドキュメントから

+2

を参照してください 'valarray'の'オペレータ/ 'プロキシオブジェクトラ式テンプレートを返すことが許可されています。 – chris

+0

私はあまりにも長く、明らかにC++から離れています。誰かが 'for(int i:temp_array){}'がループ文のためにどのように有効であるか説明できますか? 'for(init; end_condition; increment)'のようなものであってはいけませんか? – user1717828

+0

@ user1717828 C++ 11のrange-based forループを参照してください。 – milleniumbug

答えて

11

としては、演算結果がstd::begin()に直接渡すことができstd::valarray<int>であることが保証されていない@Yam Marcovivc's answerで指摘しました。一時的に構築されたオブジェクトは、トリックん:

#include <iostream> 
#include <valarray> 
int main() 
{ 
     using namespace std; 
     valarray<int> numerators = {99, 26, 25}; 
     valarray<int> denominators = {9, 2, 5}; 
     for (int i : valarray<int>(numerators/denominators)) { 
      cout << i << ","; 
     } 
     return 0; 
} 

Live Demo

18

のstd ::のvalarray引数を取る他の関数とは異なり、(開始)は、交換用のタイプを受け入れることができない(例えば(std :: valarray(v1 + v2))を使用する必要があります(std :: begin(v1 + v2)は、表現テンプレートによって生成された型として)、valarraysを含む式から返される可能性があります:std :: begin代わりに。

この関数の目的は、コンテナのセマンティクスを提供するのではなく、ループの範囲がvalarrayで機能するようにすることです。理由が何であるかについては

は、(@クリスによって指摘された)も、このあります:

[算術演算子は]のstd :: valarrayの異なる戻り値の型を用いて実施することができます。

返品が std::beginに確実に渡されることを保証することは技術的にはありません。

3
for (int i : (valarray<int> &&)(numerators/denominators)) { cout << i << ","; } 
+9

作品はありますが、Cスタイルのキャストを推薦するのは最良のアドバイスではないかもしれません。さらに詳しい説明がなくてもコードを投稿するだけで(これは他の回答を参照しても)、これは素晴らしい答えにはなりません。 –

関連する問題