草庐IT

Templates

全部标签

c++ - 具有不同签名的类方法特化

我正在尝试编写一个类模板,其中方法签名根据模板参数而变化。我的目标是尽可能少地重复代码。考虑这个例子,首先是类声明://a.hxx#ifndefA_HXX#defineA_HXXtemplatestructA{voidfoo(Tvalue)const;voidbar()const;};#include#ifndefshort_declarationtemplatestructA{voidfoo(conststd::string&value)const;voidbar()const;};#else//short_declarationtemplatestructA{voidfoo(con

c++ - 用于测试 func(args) 是否格式正确且具有必需的返回类型的特征

有许多类似的问题/答案,但我无法完全将这些答案放在一起来满足我的目的。我想要一个特质templatestructreturns_a{staticconstboolvalue;};这样returns_a::value如果F(Args)格式正确并返回T,则为真。经过更多研究后,我的工作方式如下://valueistrueifFunc(Args...)iswellformedtemplateclassis_callable{templatestaticdecltype(std::declval()(std::declval()...),void(),0)test(int);templates

c++ - Boost spirit 将整数解析为自定义列表模板

我无法用boostspirit来解析这样的文件:int[int,int,int][int,int]...没什么难的,下面的语法适用于此:templatestructparser_expression:qi::grammar{parser_expression():parser_expression::base_type(start){usingqi::double_;usingqi::int_;usingboost::spirit::qi::char_;usingqi::alpha;usingqi::alnum;usingqi::digit;usingqi::eps;usingqi::

c++ - 模板对象的类访问者模式

我正在尝试制作一个用于学术目的的自定义碰撞引擎,但我被困在一个通用的C++编程问题上我已经拥有所有可以正常工作的几何形状,并且对于问题的范围,我有这个功能:templateboolintersects(constlhs_geometry&lhs,constrhs_geometry&rhs){//returnstrueifdoesobjectsintersects//(assumethisfunctionsworksperfectlywitheverygeometrytype)}我还需要完成以下类templateclasscollidable_object{public:explicit

c++ - C++ 中多个基本模板的模板特化

我有两个模板函数:templatevoidfoo(Xa){coutvoidfoo(X*a){cout现在,如果我定义一个特化,例如:templatevoidfoo(int*a){cout此特化属于模板1还是模板2。另外,如果我在模板2之前或之后定义特化,这有关系吗? 最佳答案 将X替换为int并查看哪个主模板产生匹配的签名:templatevoidfoo(Xa)成为templatevoidfoo(int)和templatevoidfoo(X*a)成为templatevoidfoo(int*)所以,只能是第二个函数的特化。由于函数不特

c++ - 使用模板化类型的模板中的函数原型(prototype)

我想了解为什么会失败:templateTapply(Ustuff,std::functionfunction){returnfunction(stuff);}(这当然不是真正的代码)。在g++-4.8上,我得到“模板参数1无效”。谢谢!编辑:详尽的例子:基本上,我想做的是为MapFunction执行一个特定的原型(prototype)。和ReductionFunction类型。我想:MapFunction:typeof(*InputIterator)->T归约函数:(T,T)->T代码:templateTmapReduce_n(InputIteratorin,unsignedintsi

c++ - 检测类型何时不需要调用其析构函数

我正在编写一个C++11STL兼容的分配器,我想知道如何检测不调用它们的析构函数(在allocator::destroy方法中)是安全的类型。)我已经编写了分配器(一个简单的分配器),据我所知,它确实有效。我问的原因是我在我的代码中收到警告(即在我的分配器的destroy方法中。)我在最高警告级别使用VS2013(vc12),警告是:warningC4100:'c':unreferencedformalparameter在这个方法中:templateclassMyAlloc{...templatevoiddestroy(C*c)//~C();}...};如您所见,警告和代码都非常简单明

c++ - 根据模板参数内容执行或跳过代码

我想为任意类型T创建一个容器。但是,如果T有一个header类型的成员(我也定义了),我想添加一些功能。如果T没有该header成员,则可以跳过添加的功能。例如,添加的功能可能是根据执行操作的时间添加时间戳。这是我想要的伪代码:structmy_header{timestamp_ttime;//...etc...}templateclassmy_container{public:voidsome_operation(Tval){//conditionevaluatedatcompiletimeifThasamemberoftypemy_header{val.header.time=ge

c++ - 为什么枚举不能是模板?

enumerationcannotbeatemplate是我尝试用BCC64编译时给出的错误(基于Clang)以下代码:templateenumclassfooEnum:T{a,b,c,d,e};起初,我在想这种明确的禁止是由于enum底层类型的限制,如果enum底层类型可以被模板化,那么它可能会导致ill-formedenums,但是当我们试试这个:templatestructfooClass{enumclassfooEnum:A{a,b,c,d,e};};只要A类型遵循与枚举底层类型相同的限制,它就可以毫无问题地编译,你知道,定义枚举值的表达式:应该是一个整数常量,大到足以容纳枚举

c++ - 避免在数字 C++ 中调用虚函数

我正在用C++编写一些数值模拟代码。在这个模拟中,有些东西是“局部的”,在二维网格上的每个点都有一个浮点值,而另一些是“全局的”,只有一个全局浮点值。除了这种差异之外,两种类型的对象的行为相似,因此我希望能够拥有一个包含两种类型对象的数组。然而,因为这是一个数值模拟,我需要以一种方式来做到这一点:(a)尽可能避免虚函数调用开销,并且(b)允许编译器尽可能多地使用优化-特别是,允许编译器在可能的情况下进行SIMD自动矢量化。目前我发现自己正在编写这样的代码(我现在意识到,它实际上不会按预期工作):classBase{};classLocal:publicBase{public:float