在C ++中,可以在类或结构中添加隐式转换运算符。例如,3D矢量类型通常包括:
struct Vector {
float x, y, z;
operator float * () { return reinterpret_cast<float *>(this); }
};
允许使用下标访问向量的元素,传递给需要指针等的函数。我想知道:我们可以编写一个转换运算符来返回对float数组的引用,而不是指向浮?
(这纯粹是学术上的兴趣。我不知道数组引用对简单指针有什么好处,如果有的话。)
作为免费功能,我们可以这样做:
float (&convert(Vector & v))[3]
{
return reinterpret_cast<float(&)[3]>(v);
}
Vector v;
convert(v);
但是,我无法找到正确的语法来执行此操作作为转换运算符。我尝试过这样的事情:
operator float(&)[3] ()
operator float(&())[3]
float (&operator())[3]
以及其他各种排列,但我只是得到了各种语法错误(g ++ 4.8.1)。
是否可以编写一个转换运算符,返回对数组的引用,如果是,那么这样做的语法是什么?
答案 0 :(得分:6)
如果您使用的是C ++ 11,可以通过引入如下定义的ref / ptr模板别名来解决问题:
template<typename T>
using ref = T&;
template<typename T>
using ptr = T*;
使用此别名,对数组转换运算符的引用声明将采用以下形式:
operator ref<float[3]>();
它还使函数获取/返回指向函数/数组声明的指针更加清晰,例如:
ptr<int()> foo(ptr<int(int)> bar);
而不是:
int (*foo(int(*bar)(int)))();
答案 1 :(得分:5)
事实上,你可以,你几乎用最后一个:
(&operator float())[3];
关于是否需要typedef的问题,我认为是通过阅读https://stackoverflow.com/a/6755760/2925619上的评论(哪个答案是帮助我获得上述语法的答案)。
修改强>:
显然,这种语法不正确,并且在我们为Chris发现时,禁止返回对数组的引用。我想你只需要满足typedef
。