2017-03-04 63 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答案。;-)看看OP的'main'函數來獲取有關X部分的指導。 –

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++所期望的實現,可能會/可能引發負面反應;對不起。但是您可以輕鬆地將該實現轉換爲原始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; 
} 

這僅僅是一個簡單的例子,所以沒有範圍檢查和大量的錯誤。