代码之家  ›  专栏  ›  技术社区  ›  Nathan Fellman

我如何“重写”[]来接受C++中的两个参数?

  •  10
  • Nathan Fellman  · 技术社区  · 15 年前

    my_vector[bit_position]
    

    子向量的引用方式如下:

    my_vector[msb:lsb]
    

    my_vector[msb,lsb]
    

    operator[] 接受两个论点?

    我考虑的备选方案是:

    1. 使用 range 方法:

      my_vector.range(msb,lsb)

    2. my_vector["msb:lsb"]

    但他们两个都没有吸引力。第一,因为它与HDL中的建模方式有太大的不同,第二,因为我不喜欢在不需要处理字符串的情况下处理字符串,而且看起来不雅。

    最好的方法是什么?

    6 回复  |  直到 15 年前
        1
  •  23
  •   Matthieu M.    15 年前

    问题是:

    operator() 所有运算符都有一个固定的arity,有效地排除了任何类型的更改

    然后,您有几个解决方案:

    • 超载 相反: vector(msb, lsb)
    • 使用两个连续调用: vector[msb][lsb]
    • vector[msb,lsb]

    最后一个解决方案与您需要的语法相匹配,但有些微妙:

    • msb lsb 为自定义类型(对于只能在内置上重载的运算符)
    • 然后提供 operator, 对于此类型,返回 Range
    • 你终于提供了一个 operator[](Range) 在你们班上

    最高有效位 必须是自定义类型。使用 Boost.StrongTypedef 它创建一个模仿现有类型的自定义类型。

        2
  •  20
  •   Nim    15 年前

    一个简单的结构,有两个成员作为运算符[]的参数。。。

    struct pos
    {
      int lsb;
      int msb;
    };
    
    pos foo={1,2};
    
    my_vector[foo];
    

    或者在新标准中,我相信你可以简单地做到:

    my_vector[pos{1,2}]
    
        3
  •  7
  •   sbi    15 年前

    operator[] 接受两个论点?

    有两种常见的选择。一是超载 operator() () 语法。

    运算符[] 返回a 代理对象 为此 也超载了。这可以像C中的多维数组一样调用,其中有几个 [][] 一系列的。

        4
  •  4
  •   Eric    15 年前

    可以使用[]运算符来解决问题,但正如Matthieu M.指出的,需要涉及自定义类型。

        5
  •  2
  •   Eric Towers    15 年前

    两个参数运算符[]在C++中是不可能的。运算符的名称、优先级、关联性和数量由语言固定。 1

        6
  •  -1
  •   jon_darkstar    15 年前

    改用数组切片语言?=P