我正在尝试用 C++ 创建一个位 vector 类来为某些硬件建模。在我所知道的大多数 HDL(硬件描述语言)中,特定位是这样引用的:
my_vector[bit_position]
子 vector 是这样引用的:
my_vector[msb:lsb]
或
my_vector[msb,lsb]
我希望能够用我的位 vector 类做一些类似的事情。有没有办法告诉 operator[]
接受两个参数?
我考虑过的备选方案是:
使用
range
方法:my_vector.range(msb,lsb)
使用字符串并解析它:
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]
最后一个解决方案符合您需要的语法,但有些微妙:
- 您首先需要
msb
或lsb
是自定义类型(因为运算符不能仅在内置函数上重载) - 然后您为此类型提供
运算符
的重载,返回一个Range
对象 - 你终于在你的类上提供了一个自定义的
operator[](Range)
真正令人失望的是第一点:msb
或 lsb
中的一个需要是自定义类型。使用 Boost.StrongTypedef
可以稍微缓解这种情况,它创建一个模仿现有类型的自定义类型。
关于c++ - 我怎样才能 "override"[] 在 C++ 中接受两个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3977817/