template <typename T> struct has_typedef_foobar { typedef char yes[1]; typedef char no[2]; template <typename C> static yes& test(typename C::foobar*); template <typename> static no& test(...); static const bool value = sizeof(test<T>(0)) == sizeof(yes);};
有几件事我不明白:
>返回“是”的test()重载的参数类型是什么?它是指针吗?为什么typename关键字用作参数的一部分?我已经看到它也用于测试一个类是否具有给定类型的成员,而不仅仅是一个typedef,并且语法保持不变.
>有时候我见过使用test(int C :: *)的例子.这更奇怪,不知道我们引用的是哪个C成员.如果它是一个真实的函数与一个实体,实例化为一个真实的类型,并且参数被命名,它会指向什么,你将如何使用它?
template <typename T> func(int T::*arg){ *arg = 1;}struct Foo{ int x;} foo;func<Foo>(&foo::x); // something like this?func(&foo::x); // or maybe even like this?
>是模板< typename>如果没有在第二次过载中使用,则不允许使用符号?那它甚至是模板功能呢?
>奖励:是否可以一次检查是否存在多个成员?
>当依赖名称应被视为类型时,它需要以typename开头.由于C是test()的模板参数,显然C :: foobar是一个依赖名称.尽管函数声明需要在每个参数前面加一个类型,但该语言需要使用typename将依赖名称C :: foobar转换为一个类型.有了它,typename C :: foobar只是一个类型并将类型构造函数*应用于它,产生相应的指针类型.> int C :: *是一个未命名的指向int类型数据成员的指针.>总是可以省略未使用的名称.这适用于函数参数以及模板参数,即是,如果不使用模板,则可以省略模板之后的名称.大多数情况下,它以某种形式使用,在这种情况下,显然是必需的.>我认为你可以编写一个测试,测试多个方面的存在,但我不会这样做:SFINAE是不可读的.我宁愿将不同的属性测试与普通逻辑运算符结合使用.
总结以上是内存溢出为你收集整理的这个SFINAE C语法如何工作?全部内容,希望文章能够帮你解决这个SFINAE C语法如何工作?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)