草庐IT

c++ - 为模板化 key 专门化 std::hash

我试图为我自己的类型专门化哈希,一个模板化的键。我是基于cppreference.我收到编译错误“C++标准不提供此类型的散列”。我想我只是做错了。编译器甚至可以支持这种模板吗?namespacestd{templatestructMyKey{constSTypefrom;constATypeconsume;constPTypepop;};templatestructhash>{size_toperator()(MyKeyconst&key){std::hash()(key.from);std::hash()(key.consume);std::hash()(key.pop);}};}

C++:专门化成员需要 «template<>» 语法

我做错了什么?templateclassBinder{public:staticstd::vector*>all;Node*from;Node*to;Binder(Node*fnode,Node*tonode){from=fnode;to=tonode;Binder::all.push_back(this);}};std::vector*>Binder::all=std::vector*>();//hereitis谢谢。 最佳答案 静态成员的定义被编译器解释为一个特化(实际上,它是一个特化:你给出了一个特定于T=int的声明)。这可

c++ - 是否可以根据模板类型参数的嵌套 typedef 的存在来专门化模板定义?

我有一个模板,templateclasswrapper,我想根据typenameT::context_type的存在进行专攻.如果typenameT::context_type被声明,然后wrapper的构造函数和赋值运算符重载实例化应该接受强制typenameT::context_type范围。此外,wrapper对象将在成员数据中存储“上下文”。如果typenameT::context_type不存在,则重载wrapper的构造函数和赋值运算符将减少一个参数,并且不会有额外的数据成员。这可能吗?我可以在不更改config1的定义的情况下编译以下代码吗?,config2,和main(

c++ - 在 C++ 11 中,如何根据返回类型专门化采用函数对象的函数模板?

我在C++11中有一个包装函数,旨在与lambda一起使用,如下所示:templateintWrapExceptions(Func&&f){try{returnf();}catch(std::exception){return-1;}}我可以这样调用它:intrc=WrapExceptions([&]{DoSomething();return0;});assert(rc==0);生活还可以。不过,我想要做的是重载或专门化包装函数,以便当内部函数返回void时,外部函数返回默认值0,例如:intrc=WrapExceptions([&]{DoSomething();});assert(r

c++ - 使用通用模板函数为 std::ostream 和 std::vector 专门化 operator<< 的最佳方法?

我遇到了标准指定的两阶段查找问题,并且由clang(正确地)实现了与operator的过载有关的问题。对于std::ostream和std::vector.考虑一个非常通用的模板函数,该函数将其参数转换为流(仅在递归时真正有用,但简单的示例足以触发问题)://generic.htemplatevoidshift(Stream&s,Arg&arg){s这个generic.h可以在整个项目中使用。然后在其他文件中,我们要输出std::vector,所以我们定义了一个重载//vector.h#include#includestd::ostream&operatorconst&v){for(a

c++ - 根据参数的积极性专门化模板

给定一个模板templatevoidf(){...};我知道我可以针对n的特定值专门化它通过做:templatevoidf(){...};但是,有没有一种方法可以让我专门针对所有积极的n?我想到了做以下事情templatevoidf(){intdummy[n];//invalidforn所以对于n此代码无效,编译器将求助于先前的定义。不幸的是,我得到的只是一个redefinitionof'voidf()'错误。注意:我猜这可能不受标准支持。我在问是否有一些方法(也许是一些模板元编程)来实现这种效果。 最佳答案 一个选择是使用另一个间

c++ - 如何在不复制和粘贴整个类主体的情况下专门化模板?

我为移动平均线写了一个简单的类,可以与AVR一起使用。templateclassMovingAverage{...}但现在我想将此类专门用于float而无需复制和粘贴整个类主体并将所有T和Tsum更改为float,并且我不需要使用两个模板参数。Tsum是“sum”变量的类型,其中汇总了所有传递的类型T值。如果T是'uint8_t',最好使用'uint32_t'求和,但对于float或double,不需要使用精度更高的数据类型,因此我只需要一个参数用于此目的。我认为它可以这样工作:typedefMovingAverageMovingAverage或者这样:templateclassMov

c++ - 专门用于枚举的模板

谁能告诉我为什么这不起作用?enumCompCriteria{ByKey,ByValue,ByeKeyAndValue};templatestructX;templatestructX{};int_tmain(intargc,_TCHAR*argv[]){Xx;return0;} 最佳答案 您将参数化类型和参数化值混为一谈。模板参数可以是类型或常量。例如:templatestructFoo;相对于..templatestructFoo;看起来您想根据枚举常量而非类型来专门化您的模板。意思是,你需要说:enumCompCriteria

c++ - 如何专门化非模板类的模板成员函数?

假设我有一个文件alpha.h:classAlpha{public:templatevoidfoo();};templatevoidAlpha::foo(){}templatevoidAlpha::foo(){}如果我在多个cpp文件中包含alpha.h并使用GCC4.4编译,它会提示foo有多个定义。和foo跨越多个目标文件。对我来说很有意义,所以我将最后两行更改为:templateexternvoidAlpha::foo(){}templateexternvoidAlpha::foo(){}但是GCC说:explicittemplatespecializationcannothav

c++ - 为什么 shared_ptr<void> 没有专门化?

shared_ptr特殊之处在于,根据定义,它将通过调用delete来调用未定义的行为在void*上.那么,为什么没有shared_ptr抛出编译错误的特化? 最佳答案 Usingshared_ptrtoholdanarbitraryobjectshared_ptrcanactasagenericobjectpointersimilartovoid*.Whenashared_ptrinstanceconstructedas:shared_ptrpv(newX);isdestroyed,itwillcorrectlydisposeof