【问题标题】:How exactly can I overload the '{' operator?我该如何重载'{'运算符?
【发布时间】:2020-03-31 11:49:56
【问题描述】:

要初始化一个std::vector,我可以直接使用initializer_list,像这样:

std::vector<int> myVec = {1, 2, 3, 4};

如果我创建一个自定义列表类(它将包含许多项目),例如class customVector(为了简单起见,仅使用整数,我想我可以自己弄清楚如何使用模板来完成它,如果需要的话),我可以重载运算符'{',以使customVector 的实例可以在同一问题中初始化吗?这样我就可以写了

customVector myCustomVec = {1, 2, 3, 4}

【问题讨论】:

标签: c++ class operator-overloading


【解决方案1】:

您可以完成您最终想要的事情,但不能通过重载任何运算符 - { 不是运算符。

vector 通过使用带有 initializer_list 参数的构造函数来实现这一点,您可以对您的类执行相同的操作。

学习如何做并实施它作为练习。

【讨论】:

    【解决方案2】:

    你不能,因为{ 不是操作员。在 C++20 之前,以下运算符是可覆盖的:

    +    -    *    /    %    ^    &    |    ~    !    =
    <    >    +=   -=   *=   /=   %=   ^=   &=   |=   <<
    >>   >>=  <<=  ==   !=   <=   >=   &&   ||   ++   --
    ,    ->*  ->   ()   []
    

    C++20 添加了宇宙飞船操作员&lt;=&gt; 但我相信就是这样。

    【讨论】:

      【解决方案3】:

      正如其他人所指出的,{ 不是运算符。但是,您仍然可以随意使用initializer list。它是标准库的一部分。

      #include <iostream>
      #include <initializer_list>
      using namespace std;
      
      template <typename T>
      struct customVector {
          customVector(std::initializer_list<T> list) : size(list.size()) {
              arr = new T[size];
              int count = 0;
              for(auto val: list) arr[count++] = val;
          }
          T* arr;
          std::size_t size;
      
          ~customVector() {
              for(int i = 0; i < size; i++)
                  std::cout << arr[i] << std::endl;
              delete [] arr;
          }
      };
      
      int main() {
          customVector<int> myCustomVec = {1, 2, 3, 4};
      }
      

      【讨论】:

        猜你喜欢
        • 2010-12-11
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多