2017-03-04 41 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; 
} 

这仅仅是一个简单的例子,所以没有范围检查和大量的错误。