草庐IT

c++ - decltype(自动),尾随返回类型和 sfinae : can we mix them?

考虑以下代码:autof()->decltype(auto){/*dowhateveryouwanthere*/}intmain(){f();}推导出返回类型,decltype(auto)用作尾随返回类型。下面的代码是一个稍微修改过的(实际上,sfinae'd)版本:structS{staticvoidf(){}};structT{};templateautof(int)->decltype(U::f(),void()){//dowhateveryouwanthere}templateautof(char)->decltype(auto){//dowhateveryouwanthere

c++ - 如何使用 SFINAE 创建同一方法的 2 个不同实现

我已经阅读了一些关于SFINAE的文章,但找不到适合我的案例的解决方案。这是我想要做的:#includestructCByteArray{};structHLVariant{HLVariant(){}HLVariant(constHLVariant&){}HLVariant(constCByteArray&){}};templatestructSerializer{staticinlinetypenamestd::enable_if::value,CByteArray>::typeserialize(constT&value){static_assert(std::is_pod::va

c++ - 条件 (SFINAE) 覆盖

我正在尝试这样做:structA{virtualintf()const{return0;}};templatestructB:A{template::type>intf()const{return1;}};注意,我不能继承类模板(使用静态覆盖)。这种构造是否允许,模板成员B::f()是否可以覆盖成员A::f()? 最佳答案 试试这个:templatestructB:A{...};temlatestructB::type>:A{virtualintf()constoverride{return1;}};我们有两个版本的B,一个条件为真

c++ - SFINAE:运算符 [] 上的 decltype

基于答案here和here我正在尝试使用以下内容templateusingoperator_square_brackets=decltype(&T::operator[]);它在visualstudio上失败了errorC2760:syntaxerror:expected')'not']'关于如何解决这个问题有什么想法吗? 最佳答案 如果要检测类型是否具有特定函数或重载运算符,则必须调用该函数或运算符。这很重要,因为您可能有多个函数或运算符重载,并且重载解决方案始终取决于调用者。这是一个小例子,基于CppCon2014:Walter

c++ - SFINAE : Know if a function already exist or no

基本上,我想编写这样的代码:std::vectora={54,25,32.5};std::vectorb={55,65,6};std::cout这是不可能的,因为operator没有过载所以,我编写了一个函数来完成这项工作:templatetypenameT,typename...Args>std::enable_if_t>>,std::ostream>&operatorconst&t){for(autoconst&e:t)out效果很好,但我对字符串有疑问。因为字符串是可迭代的并且字符串有operator功能。所以我测试了另一个特征,比如!is_streamable_out&&_is

c++ - std::hash 特化使用 sfinae?

作为练习,我试图看看我是否可以使用SFINAE为std::pair和std::创建一个std::hash特化:tuple当它的所有模板参数都是无符号类型时。我对它们有一点经验,但据我了解,散列函数需要已经使用typenameEnabled=void进行模板化,以便我添加特化。我不太确定从这里去哪里。这是一个不起作用的尝试。#include#include#include#includenamespacestd{templatestructhash,std::enable_if_t::value>>{size_toperator()(conststd::pair&x)const{retu

c++ - 使用以下 has_member 函数时 SFINAE 无法正常工作的原因是什么?

我正在尝试来自WalterBrown'sTMPtalk的示例我正试图让他的has_member实现正常工作。然而,该实现似乎错误地返回true,这让我相信我不理解SFINAE的一些细节。#include#includetemplateusingvoid_t=void;templatestructhas_type_member:std::false_type{};templatestructhas_type_member>:std::true_type{};structFooWithType{typedefinttype;};structFooNoType{};intmain(){std

c++ - 有符号和无符号之间的 SFINAE 区别

我有将不同算术类型转换为半精度浮点类型的函数(在最低级别上只有一个uint16_t),我有不同的整数和浮点源类型函数,使用SFINAE和std::enable_if:templateuint16_tto_half(typenamestd::enable_if::value,T>::typevalue){//floattohalfconversion}templateuint16_tto_half(typenamestd::enable_if::value,T>::typevalue){//inttohalfconversion}这些是通过显式实例化从通用模板构造函数内部调用的:temp

c++ - 如何使用 SFINAE 解决重载函数中的歧义

我有一个非常令人兴奋的库,可以转换点:它应该适用于任何点类型templateautotranslate_point(T&p,intx,inty)->decltype(p.x,p.y,void()){p.x+=x;p.y+=y;}templateautotranslate_point(T&p,intx,inty)->decltype(p[0],void()){p[0]+=x;p[1]+=y;}translate_point将与具有公共(public)x和y成员的点一起工作,它也将与元组/可索引容器一起工作,其中x和y分别由第一个和第二个元素表示。问题是,另一个库定义了一个具有公共(pub

c++ - SFINAE:编译器不选择专门的模板类

我有一个SFINAE问题:在下面的代码中,我希望C++编译器选择专用仿函数并打印“special”,但它打印的是“general”。#include#includetemplatestructFunctor{voidoperator()()const{std::cerrstructFunctor{voidoperator()()const{std::cerrVec;};intmain(){Functorac;ac();}如何修复它以便自动使用专用结构?请注意,我不想直接将Functor结构专门化为Foo,但我想将其专门化为具有Vec类型的所有类型.附言:我使用的是g++4.4.4