草庐IT

c++ - 将模板方法移动到派生中断编译

给定以下代码:templateclassA{public:Tt;};classB{public:voidfoo(inti){}templatevoidfoo(A&a){}};intmain(){Aa;Bb;b.foo(a);b.foo(a.t);}这可以编译并且工作正常;B::foo()的正确重载版本被选择并为a和a.t调用。现在我引入一个新的类C,它派生自B并将::foo()的模板版本移出B并进入C:templateclassA{public:Tt;};classB{public:voidfoo(inti){}};classC:publicB{public:templatevoidf

c++ - 将模板类型与常量数值进行比较

是否有更好的方法来执行以下操作?我有一个vector类,具有以下功能:templateboolVector3::IsUnitVector()const{returnIsAlmostEqual(this->GetLength(),One::Value());}由于T可以是float或double(我使用显式模板实例化来确保只支持这些类型),我必须创建一个辅助类,它以正确的类型返回值1:templatestructOne{staticTValue();};templatestructOne{staticintValue(){return1;}};templatestructOne{stat

c++ - 隐式转换为模板

我下面的示例表明,从非模板类型到模板类型的隐式转换不会像仅涉及非模板类型的那些那样无缝地工作。有没有办法让它们继续工作?例子:structpoint;templatestructvec{vec(){}//...};templatestructvec{vec(){}vec(constpoint&p){/*...*/}//Conversionconstructor//...};structpoint{operatorvec(){returnvec(/*...*/);}//Conversionoperator};templatevecfoo(veca,vecb){returnvec(/*..

c++ - 指向可变函数模板的指针

我有一个简单的类A,它提供了一个可变函数模板。此函数使用A中的私有(private)数据,但函数本身是公开的。类(class)如下:classA{public:A():_bla("bla:"){}templatevoidbar(constT&value){std::coutvoidbar(constH&value,constT&...data){std::cout在一个名为foo.hpp的单独文件中,我有一个函数foo(),它应该能够接收和使用函数a。bar()作为参数:intmain(intargc,char*argv[]){Aa;a.bar(1,"two",3,4);foo(&a.

模板对象的 C++ 继承(G++ 编译器)

#include#include#includeusingnamespacestd;classCFirstLevel{public:CFirstLevel(conststring&_name):name(_name){}//...protected:stringname;};templateclassCSecondLevel:publicCFirstLevel{public:CSecondLevel(conststring&_name):CFirstLevel(_name){}virtualvoidPushBack(T)=0;virtualvoidPrint(intI){coutdat

c++ - C++11 中可变参数模板的函数组合

我是一名数学家,长期以来一直在进行“旧式”C++编程。我觉得C++11提供的一些新语法结构可以帮助我在我的专业项目中获得更好的代码。然而,由于我不是CS专业人士,我必须承认我缺乏理解我在自学过程中遇到的一些例子的知识,尽管到目前为止我已经很幸运/成功了。我的印象是可变参数模板可用于实现类型安全的函数组合,如thisquestion.我的担心稍微更笼统一些,因为我想用异构(但兼容)的参数/返回类型来组合函数。我用谷歌搜索了很多,发现anotherreference,但对我来说这似乎完全是“黑魔法”;)而且我不会假装我可以在我的上下文中调整代码,尽管我觉得我应该在那里找到我需要的东西。我认

c++ - 当省略号位于模式的最内层元素时,在可变参数模板中打包扩展

我在cppreference.com上看到了这个例子.我不清楚函数参数的包扩展。FunctionparameterlistInafunctionparameterlist,ifanellipsisappearsinaparameterdeclaration(whetheritnamesafunctionparameterpack(asin,Args...args)ornot)theparameterdeclarationisthepattern:templatevoidf(Ts...){}f('a',1);//Ts...expandstovoidf(char,int)f(0.1);//

c++ - 在编译时连接模板中的编译时字符串?

目前我有:templatestructtypename_struct{staticcharconst*name(){return(std::string(typename_struct::name())+"*").c_str();}};我想知道我是否可以避免我被迫分配一个字符串来执行连接的整个位。这一切都发生在编译时,即我打算获取字符串"int****"当我引用typename_struct::name().(假设我已经为int声明了相应的特化,它返回"int")正如现在编写的代码,编译器是否只在编译时与std::string进行连接?(我会同意的)或者这样的调用会在运行时产生4个基于

c++ - 是否可以编写 C++ 模板来检查构造函数的存在?

这个问题本质上是另一个用户的这个问题的后续问题,它有一些很好的答案:Isitpossibletowriteatemplatetocheckforafunction'sexistence?我想做的正是这个问题中描述的,除了我希望能够为构造函数做这件事。例如,给定这两种类型:classNormalType{public:NormalType(){std::cout还有这个用于构造对象的辅助函数:templateclassConstructHelper{public:templatestaticTConstruct(){returnT();}templatestaticTConstruct(

c++ - 如何从模板创建带有 C 链接的函数?

在看到SOanswer之后,我知道这个标准声明可能有点晚了:[C++11:7.5/1]Twofunctiontypeswithdifferentlanguagelinkagesaredistincttypeseveniftheyareotherwiseidentical.这意味着,给定:voidf1();extern"C"voidf2();decltype(f1)与decltype(f2)不同我直到现在才意识到的一个原因是主要的编译器(例如g++、clang、vc++...)不遵守这条规则。参见LIVEDEMO.但我相信大多数人(包括我)会对当前的不合规行为感到高兴。如果编译器遵循标准