簡體   English   中英

是否有可能在C ++中重載運算符“...”?

[英]Is it possible to overload operator “…” in C++?

#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...100 7...13 2...200等生成整數序列。

我想在C ++中重載...

可能嗎?

可能嗎?

不,這是不可能的。

...不是運算符,而是可變參數的占位符。

在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 ++庫的range實現的實際工作代碼。 然而,該圖書館目前處於嬰幼兒階段,不斷變化,每天都有各種不完善和根本性的變化。 它還實現了C ++的擴展方言,除了我自己以外,對於所有人來說都是陌生的,所以在這里發布預期純C ++的range實現可能/可能會引起負面反應; 對不起。 但是您可以輕松地將該實現轉換為原始C ++。 這是Boost 1.0許可證。

正如在其他答案中提到的那樣,這是不可能的,因為...不是一個有效的運算符,但在這種語言中你總是可以創建如下的奇怪習語:

#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;
}

這只是一個簡單的例子,所以沒有范圍檢查和很多錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM