草庐IT

c++ - 如何在 C++ 中引用双重模板化的自由函数

我有一个模板类,我在其中定义了引用该模板类的自由函数。这些免费功能也以不同的参数为模板。我可以从类之外调用自由函数。但是,我找不到一个自由函数调用另一个函数的正确语法。简单示例:templateclassFoo{templatefriendSf(constFoo&){returnS();}templatefriendSg(constFoo&s){returnf(s);//Seebelow,wheninstantiated,yields'nomatchingfunctionforcalltof(constFoo&)'}};floattest1(){Fooo;returnf(o);//Co

c++ - 根据模板类变量启用功能

我有一个简单的矩阵类,如下所示:templateclassmatrix{public:std::enable_if>::value,void>translate(floatx,floaty,floatz){//Dostuff}private:floatmat[m*n];};我期待std::enable_if使该功能仅在我实例化matrix时可用,但似乎这是错误的。intmain(){matrixmat3;mat3.translate(1.0f,1.0f,1.0f);return0;}上面的代码编译没有错误。我做错了什么?我知道我可以简单地输入static_assert(m==4&&n=

c++ - 当模板类型是基本类型时通过引用传递的成本

我一直听说确保最佳性能的良好做法是:按值传递基本类型(int、double...)通过const引用传递类如今,在编译器下使用C++11和完全优化,当通过const引用传递基本类型时是否会产生开销?此外,当T为int时,将执行以下功能:templateinlinevoidf(constT&x);慢于:templateinlinevoidf(constTx); 最佳答案 如果编译器真的内联代码(这对于简单模板很常见),则不会有任何区别。当无法内联函数并调用外联定义时,问题就很明显了。在那种情况下,传递引用可能会在访问变量时涉及额外的取

c++ - 使用可变参数模板作为类和方法的参数

我的问题是关于以下一段代码:templateclassA{public:templatestaticvoida(){}};templateclassB{public:templatevoidb(){A::a();}};intmain(intargc,char**argv){return0;}我有一个A类,它有一个可变参数模板并包含一个静态方法a,它有另一个可变参数模板。从其他地方(在本例中为B类)我有两组不同的可变参数模板,我想传递给A::a。编译器(GCC4.8.1)给出以下错误信息:main.cpp:Instaticmemberfunction‘staticvoidB::b()’:

c++ - 如何编写可以处理对象或指针函数调用的模板函数?

我希望能够编写一个模板函数,该函数可以对容器的所有元素调用函数。我们可以假设函数名总是相同的。然而,不知道的是容器中存放的是对象还是指针。即,我是否应该取消引用。templatevoidProcessKeyedContainer(TContainer&keyedContainer){for(autoit=keyedContainer.begin();it!=keyedContainer.end();++it){//dosomerandomstuffhere.//...autovalue=it->second;value.Process();//orvalue->Process()ift

c++ - 如何根据类型相关类型专门化 C++ 模板类函数?

我有一个C++模板化类//DefinitiontemplateclassMyCLass{public:typedeftypenameT::SMyS;//MyCLass::MySMyClass::operator()(constMyClass::MyS&x){...}我想要的是重载运算符operator()在MyS为double时表现不同。我考虑过专门化,但考虑到专门化应该作用于依赖类型的类型,在这种情况下该怎么做?谢谢 最佳答案 您可以将工作转发给一些私有(private)的重载函数:templateclassMyCLass{pub

C++ 模板转换运算符 - 请求从 到非标量类型的转换

我正在尝试了解强制转换运算符如何使用模板。考虑以下代码:#includeusingnamespacestd;structS{intv;};classA{public:A(void*ptr):ptr(ptr){}void*ptr;templateconstT&as()const{return*static_cast(ptr);}templateoperatorconstT&()const{returnas();}};intmain(){Stest;test.v=123;Aa(&test);Ss=a.as();Ss2=a;//errorhereconstS&s3=a;coutgcc给我以下

c++ - 在定义处初始化模板结构

我不确定这个主题是否与我正在寻找的完全匹配,但基本上是这样的:我能做到:structsomething{intd;}somethingType;但为什么我不能这样做呢?templatestructsomethingelse{intd;}somethingelseType;如果可以做第二种,正确的做法是什么? 最佳答案 我认为你可以,在语法上,但它被额外的限制所禁止:[温度]/1Atemplatedefinesafamilyofclassesorfunctionsoranaliasforafamilyoftypes.  templat

C++ count_if 函数 - 无法推断模板

我正在尝试使用C++的count_if函数来查看std::string中有多少个十六进制数字。当我尝试以下操作时:strings="123abc";cout我收到以下错误:count.cpp:14:13:error:nomatchingfunctionforcallto'count_if'cout但是,当我使用::isxdigit时,程序会编译并运行。我知道在::之前添加与在全局范围内使用isxdigit有关,但我不确定为什么它在这种情况下有帮助。我也认为它与C++语言环境有关,但我对它们不太熟悉。谢谢! 最佳答案 有一个函数int

c++ - 方法接受函数指针的可变参数模板

下面的代码在我看来应该可以正常工作,但它产生了C2738:couldnotdeducetemplateargumentfor'Type'.在VS2013中。templateuintGetParameterSize(ReturnType(*method)(Args...)){returnParameterSize();}templateuintParameterSize(){uintoutput=sizeof(Type);if(sizeof...(Remaining)>0){output+=ParameterSize();}returnoutput;}voidMyMethod3(inta