草庐IT

Templates

全部标签

c++ - 具有单个参数模板的成员函数包装器?

我做了一个模板函数,它接受一个成员函数作为参数。但是,由于类必须先声明才能用作成员函数参数的一部分,因此我必须将其作为一个单独的参数:templatefunctionmethodWrap(){}这意味着当显式实例化模板时(我希望这些包装器在编译时生成,而不是将成员指针作为参数传递)我在使用它时必须输入两次:functionsomeFunc=wrapMethod();为什么我不能写这样的东西:templatefunctionmethodWrap(){}并让它捕获C的类型及其成员函数指针,而无需键入两次SomeClass?或者为什么我不能将它包装在一个将C声明为“自由变量”然后具有执行推导

具有返回类型推导的 C++ 11 运算符重载

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭6年前。Improvethisquestion我有一个依赖于一种类型的模板类(例如templateclassVector)。现在,我想重载算术运算符:我可以将它们与用两种不同类型实例化的Vectors一起使用;结果与模板实例类型的推导方式相同;例子:Vectorfv={1.5,2.5};Vectoriv={1,2};autos1=fv+iv;//s1MUSTbeoftypeVector=={2.5,4.5}autos2=iv+fv;/

内部类中的 C++ 模板运算符重载

如何为类模板的内部类重载operator+?我已经搜索了几个小时,但找不到答案。这是一个不起作用的最小示例:#includeusingnamespacestd;templatestructA{structB{Tm_t;B(Tt):m_t(t){}};};templatetypenameA::Boperator+(typenameA::Blhs,intn){lhs.m_t+=n;returnlhs;}intmain(intargc,char**argv){Aa;A::Bb(17.2);autoc=b+5;cout如果我这样编译,我会得到error:nomatchfor‘operator+

c++ - 为满足条件的类专门化 `std::hash`

假设我有一个简单的bool特征类,MyTrait.也就是说,对于任何类型T,我能做到MyTrait::value并得到true或false。我想专攻std::hash适用于所有类型T其中MyTrait::value是真的。有什么办法吗?一些失败的尝试:template::value,int>::type=0>structhash{...}失败是因为:error:defaulttemplateargumentinaclasstemplatepartialspecialization我还尝试将所有部分特化的东西放在散列之后,但随后出现了T的错误消息处于非推导上下文中。有什么办法吗?至少之前

c++ - 模板类中的静态变量初始化

谁能解释为什么这段代码会崩溃?使用mingw和ubuntu的两个窗口上的行为相同。每个调试器传递给构造函数One的参数“a”被“优化掉”。当我尝试访问静态成员two_时发生崩溃;三.h#ifndefTHREE_H#defineTHREE_H#includeclassOne{public:One(conststd::string&a):a_(a){}std::stringa_;};templateclassTwo:publicOne{public:Two():One(P::name){}std::stringfoo(){returna_;}};templateclassThree{pub

c++ - 是否允许将类模板类型参数定义为相同的名称?

这似乎在MSVC中按预期编译甚至工作。但它是合法的C++代码吗?它是否保证执行此处预期的操作(即,以相同的名称将模板类型导出给结构的用户)?templatestructEnum{//TherearetwohardproblemsinCS:cacheinvalidationandnamingthings.typedefEnumTypeEnumType;}; 最佳答案 我认为类型定义是不允许的。14.6.1本地声明的名称(N4296)6Atemplate-parametershallnotberedeclaredwithinitssco

c++ - C++ 类模板中的友元比较和关系运算符

来自Lippman等人的C++Primer第5版,第16.1.2节://forwarddeclarationsneededforfrienddeclarationsinBlobtemplateclassBlobPtr;templateclassBlob;templatebooloperator==(constBlob&,constBlob&)templateclassBlob{friendclassBlobPtr;friendbooloperator==(constBlob&,constBlob&);}第一个问题:行内friendbooloperator==(constBlob&,co

c++ - 如何在 VS2015 的监 window 口中查看 C++ 模板参数

我正在调试一些C++代码,其中包含一些以T作为模板参数的C++模板。我想在watch(或鼠标悬停)中看到T是什么类型。当我添加T观看时,它不显示类型。有没有办法在调试器中解析T参数?我可以在调用堆栈上看到模板参数类型。由于类型非常复杂,调用堆栈中的行很长,不适合我的显示。而且很难阅读。有没有办法解决调试器监视中的T参数?我使用VisualStudio2015Update3。 最佳答案 在watchwidow中添加_First或_Last,它们都是_Iter类型,解析后的类型会显示出来。我不认为有任何其他方式:在编译时_Iter被使用

c++ - 尾随返回类型、declval 和引用限定符 : can they work together?

考虑以下示例:#includestructA{voidf(){}};structB{voidf()&{}};structC{voidf()&&{}};templateautof()->decltype(std::declval().f()){}intmain(){f();//f();//(*)f();}当用B调用时(第(*)行),代码不再编译std::declval转换T在特定情况下为右值引用类型。如果我们稍微改变一下,就会遇到相反的问题://...templateautof()->decltype(std::declval().f()){}//...intmain(){f();f()

c++ - 为什么类内偏特化是良构的?

根据[temp.class.spec]5/(强调我的)Aclasstemplatepartialspecializationmaybedeclaredorredeclaredinanynamespacescopeinwhichthecorrespondingprimarytemplatemaybedefined这表明部分特化(就像显式特化一样)必须出现在命名空间范围内。该段下方的示例实际上证实了这一点:templatestructA{structC{templatestructB{};};};//partialspecializationofA::C::Btemplatetemplat