草庐IT

TEMPLATE

全部标签

c++ - 具有相同名称的不同功能模板之间的重载优先级

抱歉,标题不清楚,如果您找到更好的标题,请随时进行编辑。相关主题已在PrioritybetweennormalfunctionandTemplatefunction中进行了深入讨论。,但我没有找到问题的答案。我的代码是:templatevoidf(Tt){std::coutvoidf(Tt){std::cout(1);//template1willbecalledf(1);//template2willbecalled}第1行调用template1函数的可能原因是什么?规范中是否明确定义?在第1行,我认为编译器应该给出“模糊重载”错误。 最佳答案

c++ - 获取地址时函数模板的隐式实例化

注意:我已经看过here我认为答案不正确。在获取函数地址时,控制函数隐式实例化的规则是什么?n3242的14.7.1/9是这样说的:Animplementationshallnotimplicitlyinstantiateafunctiontemplate,amembertemplate,anon-virtualmemberfunction,amemberclass,orastaticdatamemberofaclasstemplatethatdoesnotrequireinstantiation.现在,当然不需要有一个函数定义来获取它的地址。我们可以获取前向声明函数的地址,并将它们定

C++:template<class> 是什么意思?

我正在尝试理解一些C++代码。我是一位经验丰富的Java程序员,正在尝试学习C++。我已经阅读了一些关于模板的详尽文章,但没有人回答我以下模板规范是什么意思。templateclass,class>classVisualOdometryTT,templateclassNodeBuilderTT,classPoseGraphT>classVORosInterface{...};我不明白的部分是template我认为缺少某些类型规范的地方。但是代码编译没有问题。 最佳答案 以NodeBuilderTT为例,因为它更简单:NodeBuil

c++ - 部分模板特化

我有一个场景,其中有一个模板类templateclassFoo{typedefY::NestedTypeBar;intA(Barthing);voidB();intC(Xthat);//otherstuff};然后我希望A()方法在X是给定类型时具有不同的行为(但B和C可以保持不变,实际代码实际上还有大约10个其他方法,其中一些是相当冗长并且经常调整..所以我宁愿避免进行全类特化并复制并粘贴全类实现)我接着写道:templateintFoo::A(Barthing);但我的编译器(clang163.7.1)甚至拒绝将其视为任何类型的模板特化。我编写代码的方式是否隐藏了一些语法错误,或者

c++ - TMP : how to write template code which converts any struct into a tuple?

是否可以使用模板元编程将任何结构或类转换为元组?例如:structFoo{charc;inti;std::strings;};typedefstd::tupleFoo_Tuple;如果有一些模板代码可以自动为我生成Foo_Tuple就好了。回答对于这样一个简单的案例来说,这太过分了,但是对于更复杂的案例(例如ORM或任何时候你需要编写大量样板代码,而仅仅模板或宏不足以完成任务),BoostMirror看起来就像它可能非常有用。我更深入地研究了BoostMirror:基本的反射功能(在Mirror和Puddle中)不难理解,很容易设置并且似乎相当广泛(可以处理许多结构,包括C++11枚举

c++ - 为什么这些重载不是模棱两可的?

以下代码使用gcc和clang编译良好。templatestructidentity{typedefTtype;};templatevoidfoo(typenameidentity::type);templatevoidfoo(T);intmain(){foo(0);}看起来重载解析正在选择第一个重载(identity::type一个)。有人可以解释为什么重载没有歧义吗?据我所知,它们之间的唯一区别是第一个参数是非推导上下文而第二个参数不是,但是由于我明确提供了模板参数,所以我不明白为什么这很重要。 最佳答案 两种重载都是可行的,但

c++ - 解压一个类型列表

假设我有一个只接受类型模板参数的函数,我无法更改它的定义/实现。templatevoiddo_it();现在我有一个按常规方式定义的类型列表,也不能更改它:templatestructtypelist;我想实现一个函数,它接受一个类型列表,并在每个类型上运行do_it():templatevoiddo_them();到目前为止我找到的唯一解决方案是:templatevoiddo_them_impl(){do_it();}templatevoiddo_them_impl(){do_it();do_them_impl();}templateclassList,typename...Ts>v

c++ - 如何更改参数包中的最后一个参数?

我有一个函数f1()templatevoidf1(Args...args){//theimplementationisjustanexample,Idon'treallyneedacomplicated//waytosumnumbersboost::fusion::vectorv(args...);std::cout我想从函数f2()中调用它,但最后一个参数不同。有没有简单的方法?我尝试了一个幼稚的templatestructCallHelper;templatestructCallHelper{templatestaticvoidApply(Args...args){f1(args.

使用 C++11 的不同输入类型的 C++ 可变参数模板

最近我在研究现代C++。我看到一个video[在49:00]关于c++11/c++14可变参数模板。如果你想使用可变参数模板计算不同类型元组(例如int、double)的总和,使用c++11,视频给出了一个解决方案:structSum{templatestaticTsum(Tn){returnn;}templatestaticautosum(Tn,Args...rest)->decltype(n+sum(rest...)){returnn+sum(rest...);}}autox=Sum::sum(1,2.5,3);auto无法在c++11中推断返回类型,因此您必须使用decltype

c++ - 为什么这个enable_if函数模板不能专用于VS2017?

以下使用VS2015编译,但在VS2017中失败并出现以下错误。代码是否在做一些非标准的事情,已在VS2017中修复,或者VS2017应该编译它?#include"stdafx.h"#includetemplateconstexprautoToUnderlying(Ee){returnstatic_cast>(e);}templateboolconstexprIsFlags(T){returnfalse;}templatestd::enable_if_t>operator|(Elhs,Erhs){returnToUnderlying(lhs)|ToUnderlying(rhs);}en