复杂的C ++模板语法

时间:2010-12-06 05:27:07

标签: c++ templates syntax

加入SO后,每当我打开讨论模板的主题时,我都会经常看到这种语法。我尝试在谷歌搜索,但徒劳无功。

template<typename T>
char (&f(T[1]))[1]; //what is it? what is the use of '[]' brackets and the integer in it?

template<typename T>
char (&f(...))[2]; //not this either

int main() { char c[sizeof(f<void()>(0)) == 2]; } // and this?

从这里开始:SFINAE with invalid function-type or array-type parameters?

请解释我发表评论的3行。我特别想了解语法。我们可以只在模板中使用这种语法吗?

1 个答案:

答案 0 :(得分:4)

以下两个是等效的

// 1
template<typename T>
char (&f(...))[2]; 

// 2
typedef char rettype[2];
template<typename T>
rettype &f(...);

您可能在使用函数指针之前已经看过该模式

char (*XXX)();

现在只需将()替换为[N]以创建数组而不是函数部分,并将*替换为&以创建引用而不是指针,并用函数声明符替换XXX。然后,您将获得一个函数,该函数返回对大小为N的数组的引用。


您可能需要查看man signal,其中包含类似类型的函数声明。如果取出实际声明该函数的内部声明符,则会得到相同的模式

void (* signal(int sig, void (*func)(int)) )(int);
//      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ take out that 

它将返回一个指向函数的指针,该函数接受int并返回void,如该联机帮助页中所述。


如果某些条件不满足,以下只是产生编译器错误的一种方法。 如果测试foo == 2原来是false,则创建的数组大小为零,这在C ++中是非法的,并且会产生编译时错误。如果它的计算结果为true,则除了声明的数组外没有任何反应。

char c[some silly condition here];