如何"覆盖"[]接受C++中的两个参数?

Nat*_*man 10 c++ operator-overloading

我试图用C++创建一个位向量类来模拟一些硬件.在我所知的大多数HDL(硬件描述语言)中,特定位被引用如下:

my_vector[bit_position]
Run Code Online (Sandbox Code Playgroud)

和子向量的引用如下:

my_vector[msb:lsb]
Run Code Online (Sandbox Code Playgroud)

要么

my_vector[msb,lsb]
Run Code Online (Sandbox Code Playgroud)

我希望能够用我的位向量类做类似的事情.有没有办法告诉operator[]接受两个论点?

我考虑的替代方案是:

  1. 使用range方法:

    my_vector.range(msb,lsb)

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

    my_vector["msb:lsb"]

但它们都不具吸引力.第一个,因为它与它在HDL中建模的方式有太大不同,第二个是因为我不喜欢在不需要时处理字符串,而且它看起来不够优雅.

最好的方法是什么?

Mat*_* M. 23

问题:

除了operator()所有操作员都有固定的arity,这有效地排除了任何类型的变化

然后你有几个解决方案:

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

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

  • 你首先需要两种msblsb可自定义的类型(运营商无法在内置插件超载只)
  • 然后operator,,为此类型提供重载,返回一个Range对象
  • 你终于operator[](Range)在课堂上提供了一个自定义

真正的无赖是第一点:一个msblsb需要一个自定义类型.这可以在某种程度上减轻使用Boost.StrongTypedef,创建一个模仿现有的自定义类型.

  • 重载逗号运算符......这是非常不寻常的,并且可能会使人绊倒.另见http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.9的第20点. (3认同)

Nim*_*Nim 20

一个简单的结构,有两个成员作为operator []的参数......

struct pos
{
  int lsb;
  int msb;
};

pos foo={1,2};

my_vector[foo];
Run Code Online (Sandbox Code Playgroud)

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

my_vector[pos{1,2}]
Run Code Online (Sandbox Code Playgroud)

  • 即使使用旧标准,你也可以给`pos`一个构造函数并编写`my_vector [pos(1,2)]`,这也不错.在这种情况下,它应该被称为`range`,而不是`pos`,因为我们提取的是一个子范围,而不是二维寻址. (3认同)

sbi*_*sbi 7

有没有办法告诉operator[]接受两个论点?

没有.

有两种常见的替代方案.一个是过载operator()而不是.然后,您必须使用()语法调用它.

另一种是有operator[]返回一个代理对象针对operator[]超载了.这可以像C中的多维数组一样调用,有几个[][]串联.