草庐IT

c++ - 如果在推演过程中无法解析函数的地址,是SFINAE还是编译器错误?

在C++0x中,SFINAE规则已被简化,因此在演绎的“直接上下文”中出现的任何无效表达式或类型都不会导致编译器错误,而是会导致演绎失败(SFINAE)。我的问题是:如果我取了一个重载函数的地址,并且无法解析,是不是直接推理失败了?(即如果无法解决,是硬错误还是SFINAE)?这里是一些示例代码:structX{//templateT*foo(T,T);//letsnotover-complicatethingsfornowvoidfoo(char);voidfoo(int);};templatestructS{templatestructsize_map{typedefinttype

c++ - 如何使用 sfinae 选择构造函数?

在模板元编程中,可以在返回类型上使用SFINAE来选择某个模板成员函数,即templatestructA{intsum()constnoexcept{return_sum();}private:int_data[N];templatetypenamestd::enable_if::type_sum()constnoexcept{return_sum()+_data[I];}templatetypenamestd::enable_if::type_sum()constnoexcept{return_data[I];}};但是,这不适用于构造函数。假设,我要声明构造函数templatest

c++ - 如何使用SFINAE检测类的存在?

是否可以使用SFINAE检测C++中是否存在类?如果可能的话怎么办?假设我们有一个仅由某些版本的库提供的类。我想知道是否可以使用SFINAE来检测该类是否存在。检测结果是任意的,如果存在,则枚举常量为1,否则为0。 最佳答案 如果我们要求编译器告诉我们有关类类型T的任何信息,而该类类型没有甚至被声明,我们势必会收到编译错误。没有办法在那附近。因此,如果我们想知道类T是否“存在”,那么T在哪里甚至可能尚未声明,我们必须先声明T。但这没关系,因为仅声明T不会使其“存在”,因为T必须存在的意思是T已定义。如果声明了T,然后,您可以确定它是

c++ - SFINAE 和部分类模板特化

我使用基于SFINAE的方法已经有一段时间了,尤其是通过std::enable_if启用/禁用特定的类模板特化。因此,在阅读描述提议的void_t别名/检测习语的论文时,我有点困惑:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4502.pdf第4节专门讨论成语的有效性,并且指的是两方争论SFINAE在部分类模板特化中的适用性的讨论(RichardSmith指出该标准缺少关于这个话题)。在本节的最后,提到了以下CWG问题http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_ac

c++ - 使用 SFINAE 检测 constexpr

我正在升级一些C++代码以利用C++11中的新功能。我有一个特征类,其中有几个函数返回基本类型,这些基本类型在大多数情况下(但并非总是)返回一个常量表达式。我想根据函数是否为constexpr做不同的事情。我想出了以下方法:templatestructtest{templatestaticstd::true_typedo_call(int){returnstd::true_type();}staticstd::false_typedo_call(...){returnstd::false_type();}staticboolcall(){returndo_call(0);}};stru

c++ - 使用 SFINAE 进行模板类特化

假设我有这些声明templateclassUser;templateclassData;并希望实现User对于T=Data以及从Data派生的任何类但也允许在别处定义的其他特化。如果我还没有类模板的声明User,我可以简单地template::value>::type>classUser{/*...*/};在哪里templatedata>>structis_Data{staticconstboolvalue=/*somemagichere(notthequestion)*/;};但是,这有两个模板参数,因此与前面的声明冲突,其中User仅使用一个模板参数声明。还有什么我可以做的吗?(注

c++ - SFINAE 适用的 C++11 标准中提到的 "immediate context"到底是什么?

C++11标准的第14.8.2/8段规定了替换失败应或不应导致“硬”编译错误(从而导致编译失败)或“软”错误的条件这只会导致编译器从一组候选者中丢弃模板以进行重载解析(不会导致编译失败并启用众所周知的SFINAE习惯用法):Ifasubstitutionresultsinaninvalidtypeorexpression,typedeductionfails.Aninvalidtypeorexpressionisonethatwouldbeill-formedifwrittenusingthesubstitutedarguments.[Note:Accesscheckingisdone

c++ - 什么是 "Expression SFINAE"?

在http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx,VC++团队正式声明他们还没有实现C++11核心特性“ExpressionSFINAE”。但是,以下代码示例复制自http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html被VC++编译器接受。示例1:templatestructA{};charxxx(int);charxxx(float);templateAf(T){}intmain(){f(1);}示例2:structX{};st

C++ SFINAE 示例?

我想学习更多的模板元编程。我知道SFINAE代表“替代失败不是错误”。但是有人可以告诉我SFINAE的好用处吗? 最佳答案 我喜欢使用SFINAE来检查bool条件。templatevoiddiv(char(*)[I%2==0]=0){/*thisistakenwhenIiseven*/}templatevoiddiv(char(*)[I%2==1]=0){/*thisistakenwhenIisodd*/}它可能非常有用。例如,我用它来检查使用运算符逗号收集的初始化列表是否不超过固定大小templatestructVector{t

c++ - 解决此模板分辨率歧义的正确方法是什么?

假设我写了:template::value>>voidfoo(){std::coutvoidfoo(){std::cout();}当我编译这个时,我得到一个关于调用歧义的错误(如果我用float替换short则没有错误)。我应该如何修复此代码,以便获得整数类型的较高版本和较低版本?如果您的建议适用于foo()的多个专用版本以及通用版本,则可加分。 最佳答案 我喜欢Xeo'sapproach对于这个问题。让我们做一些带有后备的标签调度。创建一个从自身向下继承的选择器结构:templatestructchoice:choice{};te