gpt4 book ai didi

c++ - 复杂的 C++ 模板语法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:43 25 4
gpt4 key购买 nike

加入 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
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++中是非法的,并且将获得编译时错误。如果它的计算结果为真,则除了声明的数组外什么也不会发生。

char c[some silly condition here];

关于c++ - 复杂的 C++ 模板语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4363471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com