c++ - 我怎样才能 "override"[] 在 C++ 中接受两个参数?

标签 c++ operator-overloading

我正在尝试用 C++ 创建一个位 vector 类来为某些硬件建模。在我所知道的大多数 HDL(硬件描述语言)中,特定位是这样引用的:

my_vector[bit_position]

子 vector 是这样引用的:

my_vector[msb:lsb]

my_vector[msb,lsb]

我希望能够用我的位 vector 类做一些类似的事情。有没有办法告诉 operator[] 接受两个参数?

我考虑过的备选方案是:

  1. 使用 range 方法:

    my_vector.range(msb,lsb)

  2. 使用字符串并解析它:

    my_vector["msb:lsb"]

但两者都没有吸引力。第一个,因为它与它在 HDL 中建模的方式太不一样了,第二个,因为我不喜欢在不必要的时候处理字符串,而且它看起来不够优雅。

执行此操作的最佳方法是什么?

最佳答案

问题:

Apart from operator() all operators have a fixed arity, which effectively precludes any kind of change

然后你有几个解决方案:

  • 重载 operator() 而不是:vector(msb, lsb)
  • 使用两个连续调用:vector[msb][lsb]
  • 重载逗号运算符:vector[msb,lsb]

最后一个解决方案符合您需要的语法,但有些微妙:

  • 您首先需要 msblsb 是自定义类型(因为运算符不能仅在内置函数上重载)
  • 然后您为此类型提供运算符的重载,返回一个Range对象
  • 你终于在你的类上提供了一个自定义的operator[](Range)

真正令人失望的是第一点:msblsb 中的一个需要是自定义类型。使用 Boost.StrongTypedef 可以稍微缓解这种情况,它创建一个模仿现有类型的自定义类型。

关于c++ - 我怎样才能 "override"[] 在 C++ 中接受两个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3977817/

相关文章:

c++ - gcc 深/双/嵌套类型转换

c++ - istream::ungetc() 与 stringbuf(在 stringstream 中使用)一起工作的可能性有多大?

c# - 是否可以定义扩展运算符方法?

c++-cli - C++/CLI : how to overload an operator to accept reference types?

c++ - 毁灭战士 3 来源 : why does a class representing 2-vectors overload the subscript operator twice?

c++ - **不可能使用C++运算符重载

C++ 通过位移位和减法除法无法正常工作

c++ - 插入数组的额外字符

c++ - 如何消除此枚举到字符串映射代码的样板?

c++ - 组合问题 : operator '==' and operator '-'