overloading [] and , c++11

overloading [] and , c++11

本文关键字:c++11 and overloading      更新时间:2023-10-16

假设我们有这个表达式

auto x =Object.operator[][1,2,3,4];

我希望我的C++代码将数字 1 2 3 4 插入到位于我的代码下面的对象内的向量中。

class Object{
    Object operator[](int temp){
        this->x.push_back(temp);
        return *this;
    }
    vector<int> x;
};
int main()
{
    auto x =Object().operator[][1,2,3,4];
   return 0;
}

此代码无法编译。据我所知,我必须重载逗号和 [],但我无法弄清楚如何做到这一点。我是C++新手。

编辑额外问题.!!!!!!!!!!!!!!!!!!!!!!!!!

检查下面的代码,这是我的更新。

#include <iostream>
using namespace std;
class List{
    public:
    List(){}
    List(int a){
        x.push_back(a);
    }
    ~List(){}
    int operator[](int a){
        return a;
    }
        const char* operator[](const char * a){
        return a;
    }
    vector <int> x;
};
int main()
{
    List x = List{}[1,2,3,4];

   return 0;
}

多亏了你们,我接近我正在寻找的答案。例如,如何将 [] 中包含的所有值添加到某个向量中,并将其发送到列表并添加到其向量中。逗号运算符会重载,但我不知道怎么做。据我所知,我可以理解的是,我必须在 1 之前放置一个对象,并且将调用重载的逗号,但我不能做任何其他特殊语法 that.is 可以调用它。

在不重载逗号的情况下执行此操作的一种可能的、直接的方法是:

class Object
{
public:
    template<typename Numbers = std::initializer_list<int>>
    Object &operator[](const Numbers &numbers)
    {
        std::copy(std::begin(numbers), std::end(numbers), std::back_inserter(x_));
        return *this;
    }
private:
    std::vector<int> x_;
};
int main()
{
    Object object;
    auto &obj = object[{1,2,3,4}];
    std::vector<int> numbers = {1, 2, 3, 4};
    obj = obj[numbers];
    return 0;
}

一些值得注意的变化:

  • 类成员可见性
  • 运算符 [] 更通用并返回引用
  • 调用方通过引用接受

我知道您想在 C++中使用 [] 运算符将数字列表插入到对象的向量中。

如果是这种情况,您可以使用 C++11 的隐式转换。下面是一个示例代码:

class Object
{
public:
    Object operator[]( vector<int> vx )
    {
        v.insert( v.end(), vx.begin(), vx.end() );
        return *this;
    }
private:
    vector<int> v;
};

这样您就可以使用:

Object o;
o[{1, 2, 5}];

将列表"1、2、5"轻松插入到对象的向量中。{1, 2, 5} 将被隐式转换为整数向量,并且将调用并执行您的自定义 [] 运算符函数。

operator[](int)是一个二元运算符。不能重载以接受超过 1 个索引参数。

这里有一些工作示例:

#include <iostream>
#include <vector>
using namespace std;
class Object{
  public:
    Object operator[](int temp){
        this->x.push_back(temp);
        return *this;
    }
    vector<int> x;
};
int main() {
    auto x = Object();
    x[1];
    x[2];
    x[3];
   return 0;
}