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[]接受两个论点?
我考虑的替代方案是:
使用range方法:
my_vector.range(msb,lsb)
使用字符串并解析它:
my_vector["msb:lsb"]
但它们都不具吸引力.第一个,因为它与它在HDL中建模的方式有太大不同,第二个是因为我不喜欢在不需要时处理字符串,而且它看起来不够优雅.
最好的方法是什么?
Mat*_* M. 23
问题:
除了
operator()所有操作员都有固定的arity,这有效地排除了任何类型的变化
然后你有几个解决方案:
operator()而不是:vector(msb, lsb)vector[msb][lsb]vector[msb,lsb]最后一个解决方案符合您需要的语法,但有点微妙:
msb或lsb可自定义的类型(运营商无法在内置插件超载只)operator,,为此类型提供重载,返回一个Range对象operator[](Range)在课堂上提供了一个自定义真正的无赖是第一点:一个msb或lsb需要一个自定义类型.这可以在某种程度上减轻使用Boost.StrongTypedef,创建一个模仿现有的自定义类型.
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)
有没有办法告诉
operator[]接受两个论点?
没有.
有两种常见的替代方案.一个是过载operator()而不是.然后,您必须使用()语法调用它.
另一种是有operator[]返回一个代理对象针对operator[]超载了.这可以像C中的多维数组一样调用,有几个[][]串联.