2010-03-17 85 views
6

我怎样才能明白什么是这里声明:(这是从另一个职位采取this forum奇怪的声明(模板)。 C++

template<typename C> static char (&f(ChT<int Fallback::*, &C::x>*))[1]; 

我是这样看:调用(ChT<int Fallback::*, &C::x>*)静态函数f

模板,但后来我没有意义为什么有一个地址的运算符,为什么有一个数组?

我还在学习如何理解C++声明,所以请慢慢仔细地解释一下。

+0

你为什么要这样做? – Axarydax 2010-03-17 15:54:08

+0

@Axarydax在做什么? – 2010-03-17 15:55:03

+0

我想我看到他从xD得到的那个 – 2010-03-17 16:02:25

回答

3

看到返回类型很重要。 所以,这个函数的返回类型是参考char[1]; 试想f返回类似参考以下:

char ret[1]; 

例如

template<typename C> static char (&f(ChT<int Fallback::*, &C::x>*))[1] 
{ 

    static char xx[1] = {'F'}; 
    return xx; 
} 
7

使用一些类型定义:

typedef char (&arrayref_t)[1]; 

这是字符数组的引用。该数组有一个元素。

typedef ChT<int Fallback::*, &C::x> tmpl_t; 

这是一个模板类,具有类型“指针Fallback类的int构件”实例化,以及构件指针xC类。

​​

函数现在需要一个指针到一个tmpl_t并返回一个arrayref_t

+0

我刚才观察到很有趣的事情(是的,我仍然在咀嚼它)。如果你在说“这是...,并且是类C中的成员指针x”,应该指出,由于类ChT的声明,C类中的这个成员指针实际上是类Fallback的成员。所以,事实上他们是相互联系的。 – 2010-03-17 17:05:55