如何编写返回引用数组的C ++转换运算符?

时间:2013-12-01 04:25:28

标签: c++ arrays operator-overloading implicit-conversion

在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)。

是否可以编写一个转换运算符,返回对数组的引用,如果是,那么这样做的语法是什么?

2 个答案:

答案 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