是否有可能使操作员过载" ..."在C ++中?

时间:2017-03-04 09:11:51

标签: c++ operator-overloading standards

#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 ++中重载...

有可能吗?

3 个答案:

答案 0 :(得分:4)

  

有可能吗?

不,这是不可能的。

...不是运营商,而是variadic arguments的占位符。

答案 1 :(得分:3)

C ++中没有...运算符,所以你不能重载它。

但是,您可以使用普通名称,例如range

假设标题定义了合适的range函数,那么您的目标

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

......然后可以看起来像这样:

#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 ++的方言,对于除了我自己之外的所有人来说都是陌生的,所以在这里发布range实现纯C ++的预期,可能/可能会引起负面反应;对不起。但是您可以轻松地将该实现转换为原始C ++。它是Boost 1.0许可证。

答案 2 :(得分: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;
}

这只是一个简单的例子,所以没有范围检查和很多错误。