草庐IT

c++ - 检查方法的模板特化是否存在

假设我有一个这样的模板类:templateclasshandler{private:staticvoidvalidate_core(constTRequest&request);staticTResponseprocess_core(constTRequest&request);public:staticTResponseprocess(constTRequest&request){if(validate_coreisimplemented){log("beginvalidate");validate_core(request);}returnprocess_core(request)

c++ - 确定结构是否具有特定类型的成员

假设我有一个结构Foo,我想确定Foo中是否有一个int。structFoo{inta;charc;};has_int::value;//shouldbetrue这是我真正想要的最基本形式,检查特定类型:has_type::value;如果我知道如何执行上述操作,我可以将其转换为我的最终目标:has_pointer::value;//falsestructBar{inta;void*b;};has_pointer::value;//true至于我尝试过的,很难开始,我能想到的最好的是,如果我能得到一个结构中包含的类型的包,我可以写剩下的:templateconstexprboolany

c++ - 为什么未调用的模板类成员 *parameters* 被实例化?

这个问题是对立的:Whyuncalledtemplateclassmembersaren'tinstantiated?,作者对某些模板方法未实例化感到惊讶。我遇到了相反的问题:我的部分函数在我不期望的时候被实例化了。采取以下程序:templateclassFoo;templateclassBar{templatevoidBaz(typenameFoo::Xx){}};intmain(){Barbar;}此程序编译失败并出现错误:test.cc:6:40:error:implicitinstantiationofundefinedtemplate'Foo'templatevoidBaz(

c++ - 在没有隐式转换的情况下在编译时检测运算符

我正在使用C++03methodtodetectthepresenceofafunctionatcompiletime.我必须使用此方法而不是void_t方法,即使我使用的是C++14,因为我必须支持GCC4.9,并且在使用void_t方法时出错(奇怪的是只有Ubuntu14的GCC4.9有这个问题,而不是Fedora的,但它已在GCC5+AFAICT中全面修复)。具体来说,我正在检查operator是否存在这样我就可以拥有一个pretty-print功能,可以接受任何类型。当函数被调用时,如果类型支持它,您会得到常规的ostream输出,并且当运算符未定义时,您会收到一条关于没有实现

c++ - 为什么在这种情况下重载决议不明确?

我编写这段代码是为了检查类类型是否有begin功能。structfoo//asimpletypetocheck{intbegin(){return0;}};structFallback{intbegin(){return0;}};templatestructHasfuncBegin:T,Fallback{typedefcharone;typedefinttwo;templatestaticonecheck(int(X::*)()=&HasfuncBegin::begin);templatestatictwocheck(...);enum:bool{yes=sizeof(check())

c++ - 编译时分派(dispatch) : conditional on valid call

给定以下代码:templateclassJoinedObjectGroup:public_ObjectSpaceHolder,public_ObjectSpaceHolder{public:JoinedObjectGroup(GroupA&groupA,GroupB&groupB):_ObjectSpaceHolder(groupA),_ObjectSpaceHolder(groupB){}templateObjectTypeget(){//Dispatchtoappropriatehandler:onlyoneofthefollowingactuallycompilesas//eit

c++ - 基类和派生类中的模板成员之间的重载解析

Microsoft编译器(VisualStudio201715.2)拒绝以下代码:#includestructB{template=0>voidf(){}};structD:B{usingB::f;template=0>voidf(){}};intmain(){Dd;d.f();d.f();}错误是:errorC2672:'D::f':nomatchingoverloadedfunctionfounderrorC2783:'voidD::f(void)':couldnotdeducetemplateargumentfor'__formal'note:seedeclarationof'D

c++ - 在不触及主模板的情况下使用 SFINAE 部分特化

我正在尝试使用一次为多种类型专门化一个结构模板SFINAE。我知道类似以下的方法:#includetemplatestructS{voidoperator()(){std::coutusingenabled_type=typenamestd::enable_if::value||std::is_same::value>::type;templatestructS>{voidoperator()(){std::cout()();return0;}我的问题是我无法修改S的主模板添加typenameEnable=void的结构,因为它是仅外部header的一部分图书馆。所以主模板必须如下所示

c++ - 如何实现构造函数,使其只接受使用 typeid 的输入迭代器?

我想为某个对象实现一个范围构造函数,但我想限制它只接受两个输入迭代器。我尝试用gcc7.1.0编译这段代码。文件test.cpp#include#include#includetemplateusingtraits=typenamestd::iterator_traits::iterator_category;templateclassA{private:std::vectorv;public:template)==typeid(std::input_iterator_tag)>>A(InputIteratorfirst,InputIteratorlast):v(first,last)

c++ - SFINAE std::isfinite 和使用 std::is_arithmetic 的类似函数

我在将一些代码从VS2013移植到GGC4.9和Clang3.5(使用libc++)时遇到了编译失败。代码的要点是#includestructFoo{operatordouble()const{return(101.0);}//Implicitconversiontodouble};intmain(int,char**){Foofoo;std::exp(foo);//Compilesstd::isfinite(foo);//Doesnotreturn(0);}我相信isfinite调用无法编译,因为cmath中的isfinite函数的返回类型声明为:typenamestd::enabl