草庐IT

template-specialization

全部标签

c++ - 创建新的原始类型

有没有一种方法可以创建一种类似于基本类型(例如char)的新类型,并且可以在它们之间隐式转换,但会在模板中进行不同的解析,例如,以下代码有效?typedefcharutf8;templatevoidf(Tc);templatevoidf(charc){std::coutvoidf(utf8c)//errorC2766:explicitspecialization;'voidf(char)'hasalreadybeendefined{std::cout我在想一个包含单个数据成员的类可能是可行的,如果是的话,最干净的方法是什么,编译器是否能够像原始数据一样对其进行优化。编辑:我尝试了BOO

c++ - MI 和隐式复制构造函数错误(原为 : Under what conditions can a template be the copy constructor?)

我很确定这个问题的答案是,“模板永远不可能成为复制构造函数。”不幸的是,我只花了3个小时弄清楚为什么我会收到有关递归的警告,跟踪它到复制构造函数,看着调试器发疯,不让我看递归代码,最后跟踪到一个基础构造函数中缺少“&”。你看,我有一个复杂的基于策略的设计主机,它已经运行了一段时间了。我着手将两个策略合二为一并遇到了一个递归复制构造函数。将其缩小为一个策略,该策略需要提供一个构造函数,该构造函数可以采用一种XXX概念作为其参数,但在这种情况下,我只是放弃它。所以我写了structmy_policy{templatemy_polity(Tconst){}//missing'&'...oop

c++ - 具有多个模板参数的模板特化

假设我有这个:templateclassfoo{public:voidset(constT&t);};templatevoidfoo::set(constT&t){ints=X;//...etc}我可以特化函数类型“T”但将“X”保留为模板参数吗?classbar;templatevoidfoo::set(constbar&t){ints=X;//...etc}这可能吗? 最佳答案 一旦你掌握了窍门,这是出奇的简单templateclassfoo{private:templateclassparams{};public:voidse

c++ - template<>(<> 中没有任何类 T)是什么意思?

我正在阅读STL_construct.h中的一些源代码,在大多数情况下,它在中有某物我看到一些只有“template...”的行。这是什么? 最佳答案 这意味着接下来是一个templatespecialization. 关于c++-template(中没有任何类T)是什么意思?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/10682416/

c++ - 不完整类型的无效使用 (SFINAE)

我正在尝试在模板化结构中使用一些SFINAE。我将我的问题简化为以下内容并且可以完成这项工作:templatestructtest{voidmyfunc();};templatevoidtest::myfunc(){std::coutvoidtest::myfunc(){std::coutfoo;testbar;foo.myfunc();bar.myfunc();}使用这段代码,我得到了结果:testtruetestfalse但是,如果我想考虑我的structtest有多个模板参数,我尝试像这样调整上面的内容:templatestructtest{voidmyfunc();};temp

c++ - 在运行时选择正确的模板特化

我有templatestructa{staticvoidf();};在代码的不同地方进行特化。如何调用正确的a::f对于i只在运行时知道?voidf(inti){a::f();}//won'tcompile我不想列出i的所有可能值在一个大switch.编辑:我想到了类似的东西#includetemplatestructa{staticvoidf();};structregf{typedefvoid(*F)();enum{arrsize=10};staticFv[arrsize];templatestaticintapply(Ff){static_assert(i::f;return0;

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

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

c++ - 我怎样才能部分特化所有枚举的类模板?

假设我有一些类模板:templateclass{//....}我可以通过以下方式为ALL指针部分特化此模板:templateclass{//....}我能以某种方式专门化ALL枚举的模板吗?即,做类似的事情:(虽然这不起作用)templateclass{//....} 最佳答案 使用C++11和SFINAE。#includetemplatestructSpecialize{};templatestructSpecialize::value>::type>{voidconvert(){}};enumE{};intmain(){Spec

c++ - static_if 会弃用模板特化吗?

像这样的一些常用模板特化:templateclassC{voidcommon(){...}voidf2=delete;};templateclassC{voidcommon(){...}voidf1(){...}};可以用static_if表示作为:templateclassC{voidcommon(){...}static_if(std::is_same::value){voidf1(){...}}else{voidf2()=delete;}}这些是直接竞争的功能吗?模板特化可以做static_if做不到的事情吗?看起来static_if可以做模板特化可以做的一切,甚至更多。顺便说一

c++ - 当我在 C++ 中对类模板进行完全特化时,为什么我不必定义相同的成员?

我很惊讶地发现以下编译:#includeusingnamespacestd;templateclassSomeCls{public:voidUseT(Tt){coutclassSomeCls{//NoUseT?WTF?!??!?!};intmain(intargc,char*argv[]){SomeClsd;SomeClsi;d.UseT(3.14);//Uncommentingthenextlinemakesthisprogramuncompilable.//i.UseT(100);return0;}为什么允许这样做?classSomeCls似乎是错误的不需要voidUseT(Tt)