草庐IT

c++ - 从模板检查成员函数重载是否存在

是否可以从模板成员函数中检查一个类是否有某个成员函数重载?我能找到的最好的类似问题是这个:Isitpossibletowriteatemplatetocheckforafunction'sexistence?据我了解,这不适用于检查函数重载的情况。这是一个如何应用它的简化示例:structA;structB;classC{public:templatevoiddoSomething(std::stringasdf){Tdata_structure;/**somecode*/if(OVERLOAD_EXISTS(manipulateStruct,T)){manipulateStruct(

c++ - SFINAE canAdd模板问题

我正在尝试编写一个SFINAE模板来确定是否可以将两个类加在一起。这主要是为了更好地理解SFINAE的工作原理,而不是出于任何特定的“现实世界”原因。所以我想到的是#includestructVec{Vecoperator+(Vecv);};templatestructCanBeAdded{structOne{char_[1];};structTwo{char_[2];};templatestaticWmake();templatestructforce_int{typedefvoid*T;};staticOnetest_sfinae(typenameforce_int()+make(

c++ - 我的 SFINAE 检查 std::map/std::vector 有什么问题?

我有一个简单的SFINAE场景来区分标准容器,如std::map:templatestructHasKeyType:sfinae_test{//(C)templatestaticYestest(typenameContainer::key_type*);//(A)templatestaticNotest(...);enum{value=(sizeof(test(null))==sizeof(Yes))};//(B)};与structsfinae_test{typedefcharYes;typedeflongNo;staticvoid*constnull;};当我用HasKeyType>

c++ - 如何在不知道成员类型的情况下检查 SFINAE 是否存在成员?

在C++11之前的代码中,如果我正在寻找一个我不知道其类型的成员变量,我如何使用SFINAE检查该成员是否存在? 最佳答案 这是一个使用您要求的成员检测器习语的示例:templatestructhas_x{typedefchar(&yes)[1];typedefchar(&no)[2];//thiscreatesanambiguous&Derived::xifThasgotmemberxstructFallback{charx;};structDerived:T,Fallback{};templatestructCheck;temp

c++ - Concepts 会取代 SFINAE 吗?

概念可能属于C++标准(C++17,或者可能是C++20)。所以我想知道这个新功能是否可以完全取代SFINAE,或者它只是SFINAE的一个小版本,具有很好的错误报告和类型检查。是否存在SFINAE是唯一选择而不是使用Concepts的情况? 最佳答案 与concepts正在形成并在编译器中实现(目前只有gcc>=6.1带有选项-fconcepts),看起来它们可以做你使用SFINAE可以做的一切只有更好(更清晰地表达意图并生成简洁的错误消息),以及更多(例如缩写模板)。所以简单的答案是是。

c++ - 在没有 SFINAE 的情况下启用类方法

我正在寻找一种无需SFINAE即可启用类方法的方法,可能是通过继承。Imworkingonanimprovedversionofstd::function(带有operator()的仿函数类)哪个限定符(const,volatile)取决于它的模板参数,例如:myfunctor提供operator()()myfunctor提供operator()()constmyfunctor提供operator()()volatile等等。我不能使用SFINAE解决这个问题的主要原因是,如果我使用SFINAE,则operator()需要像这样模板化:templateautooperator()(Ar

c++ - 有没有办法使用 SFINAE 检测是否未声明非模板化非成员函数?

我正在尝试回答thisquestion使用SFINAE和decltype。总而言之,发布者想要一个函数,该函数的行为取决于是否在编译单元中声明了另一个函数(声明早于或晚于所讨论的函数)。我尝试了以下方法:autosome_function_2_impl(int)->decltype(some_function_1(),void()){cout但是,我收到此错误消息:main.cpp:4:60:error:'some_function_1'wasnotdeclaredinthisscopeautosome_function_2_impl(int)->decltype(some_funct

c++ - 删除未使用的重载会导致编译错误?

我正在考虑删除一些未使用的重载,并触发了一个编译错误,编译器说这是一个模板替换错误。但我认为“替换失败不是错误”,无论如何,为什么删除过载会导致它?简单的开始:#includeintParseInt(constchar*);intParseInt(std::string);boolF(int(*)(constchar*));boolUser(){returnF(ParseInt);}在这里,User()使用解析例程的地址调用F。一切都很好。ParseInt已重载,但只有一个重载与F的签名匹配。输入F的模板化重载:boolF(int(*)(constchar*));templatestr

c++ SFINAE 检查指向类的指针中的方法

我有这样的代码:templateclassDiskFileFlush{TABLELOADER*_loader;public:voidprocess(){//Iwanttocallthis,//onlyifloader->refresh()exists.notifyLoader();}boolnotifyLoader(){if(loader!=nullptr)returnloader->refresh();returnfalse;}};只有loader->refresh()存在时,我才想调用notifyLoader()。我也使用void作为默认类型,有没有更好的方法来做同样的事情?

c++ - 使用 C++ 检测惯用语计算任意可调用对象的参数

我一直在使用C++detectionidiom创建一个元函数来确定任意可调用对象的参数数量。到目前为止,我有这个(完整的、可编译的代码在http://ideone.com/BcgDhv):staticconstexprautomax_num_args=127;structany{templateoperatorT(){}};templateusingcallable_archetype=decltype(declval()(declval()...));templateusingis_callable_with_args=is_detected;templatestructcount_