2017-03-04 3 views
3
#include <iostream> 
#include <vector> 

using namespace std; 

// 
// Below is what I want but not legal in current C++! 
// 
vector<int> operator ...(int first, int last) 
{ 
    vector<int> coll; 
    for (int i = first; i <= last; ++i) 
    { 
     coll.push_back(i); 
    } 

    return coll; 
} 

int main() 
{ 
    for (auto i : 1...4) 
    { 
     cout << i << endl; 
    } 
} 

1...1007...132...200などの構文を使用して整数シーケンスを生成する必要があります。演算子 "..."をC++でオーバーロードすることはできますか?

...をC++でオーバーロードしたいです。

可能ですか?

+0

コードをできるだけ読めないようにしたいですか? –

+11

'...'は演算子ではありません。利用可能なものは[こちら](http://stackoverflow.com/questions/4421706/operator-overloading)にチェックしてください。 –

+1

まあ、存在しない演算子を_overload_することはできません。 –

答えて

4

可能でしょうか?

いいえ、できません。

...は、オペレータではなく、variadic argumentsのプレースホルダです。

+0

これはX/Yの質問に対するX/Yの回答です。;-) Xの部分についてのガイダンスについては、OPの 'main'関数を見てください。 –

3

C++には...演算子がないため、オーバーロードできません。

ただし、rangeなどの通常の名前を使用できます。

適当range関数を定義ヘッダ、自分の意図したプログラム

int main() 
{ 
    for (auto i : 1...4) 
    { 
     cout << i << endl; 
    } 
} 

&hellipを仮定します。

#include <p/expressive/library_extension.hpp> 
using progrock::expressive::range; 

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

int main() 
{ 
    for(auto i : range(1, 4)) 
    { 
     cout << i << endl; 
    } 
} 

これはExpressive C++ library's range implementationを使用した実際の作業コードです。しかし、その ライブラリーは現在、すべての種類の不完全性と基本的な変更が毎日行われており、非常に幼稚な段階にあります。また、それはC++の拡張された の方言を実装しています。これは私自身以外の人にはあまり馴染みがないので、純粋なC++が期待されるここにrangeの実装を投稿すると、おそらくは/ごめんなさい。しかし、その実装を生のC++に簡単に変換できます。 Boost 1.0ライセンスです。

1

...が有効な演算子ではありませんが、この言語であなたは常にこのような奇妙なイディオムを作成することができますので、これは可能ではない他の回答で述べたように:

#include <iostream> 

struct int_it 
{ 
    int_it (int l, int r): left(l), right(r){} 

    void operator++() { left++;} 
    bool operator!=(const int_it& rhs) { return left != rhs.right;} 
    int operator*(){ return left;}; 

    int left; 
    int right; 
}; 

class range_op 
{ 
public: 
    static range_op op() { return {0,0}; } 
    operator int() { return right - left; } 
    auto begin(){ return int_it{left, right}; } 
    auto end(){ return int_it{right,right}; } 
private: 
    range_op(int l, int r): left(l), right(r){} 
    int left; 
    int right; 

    friend range_op operator*(int lhs, range_op r); 
    friend range_op operator*(range_op r, int rhs); 
}; 

range_op operator*(int lhs, range_op r) 
{ 
    return range_op{lhs, r.right}; 
} 

range_op operator*(range_op d, int rhs) 
{ 
    return range_op{d.left, rhs}; 
} 

const auto o = range_op::op(); 

int main() {  
    for (int i : 2*o*6) 
    { 
     std::cout << i << std::endl; 
    } 
    return 0; 
} 

これは、そう、ちょうど簡単な例であります範囲チェックやバグがたくさんあります。

関連する問題