草庐IT

TEMPLATE

全部标签

c++ - 我可以将 `extern template` 放入头文件中吗?

在头文件中放一个外部模板,然后在单元编译文件中显式模板实例化有效吗?例如在g++的编译示例中,这是为了避免nothing的实例化吗?两次?为什么没有人这样写而更喜欢复制externtemplate每个.cpp文件中的行?A.hpp:#ifndefHEADERC_A#defineHEADERC_Atemplatestructnothing{};externtemplatestructnothing;#endifA.cpp:#include"A.hpp"templatestructnothing;ma​​in.cpp:#include"A.hpp"#includeintmain(){not

c++ - 转发引用可以使用别名模板作为别名吗?

这是我之前问题的延续:Cananidentityaliastemplatebeaforwardingreference?似乎以下代码在Clang3.7.0(demo)和GCC6.0.0(demo)中都有效:templateusingforwarding_reference=T&&;templatevoidfoo(forwarding_reference){}intmain(){inti{};foo(i);foo(1);}编译器用别名模板代替转发引用是否正确,这可能是一种奇特的编写方式? 最佳答案 这确实符合标准。§14.5.7/2:

c++ - 折叠任意多个可变参数包

我正在阅读EricNiebler的post在他的小型元编程库上。在尝试实现他遗漏/列为挑战的部分时,我只剩下以下transform的实现:templateusingmeta_apply=typenameF::templateapply;templatestructtypelist_transform;//unarytemplatestructtypelist_transform,F>{usingtype=typelist...>;};//binarytemplatestructtypelist_transform,typelist,F>{usingtype=typelist...>;}

c++ - 多种模板类型

在C++中是否可以有多个模板类型?例如;templateclassBaseClass>classMyClass{};templateclassMyClass{};并使用它;//Usingthefirsttemplate(templateclassBaseClass)templateclassMyFirstSubClass:publicMyClass{};//Usingthesecondtemplate(classBaseClass)classMySecondSubClass:publicMyClass{}; 最佳答案 你不能有同名的

c++ - 当参数是函数参数包时,在部分排序期间推导模板参数

N452714.8.2.4[temp.deduct.partial]3Thetypesusedtodeterminetheorderingdependonthecontextinwhichthepartialorderingisdone:(3.1)—Inthecontextofafunctioncall,thetypesusedarethosefunctionparametertypesforwhichthefunctioncallhasarguments.(3.2)—Inthecontextofacalltoaconversionfunction,thereturntypesofth

c++ - 在模板模板参数中抛出多模板类 - 模板绑定(bind)?

给定以下类:templateclassB>classA{Bb;};我现在可以写这样的代码了:Aa1;Aa2;将除一个参数外所有参数都指定的多参数类放入B中的最优雅方法是什么?像带有int-keys的map?我唯一能想到的是:templateusingC=MyMap;A>a3;是否有这样一个模板等同于std::bind,我们可以只提供一部分参数并保留其中一个参数?我很确定该语言没有提供此功能,但人们之前一定已经解决了这个问题。A>a3; 最佳答案 没有与std::bind等效的内置模板,但您可以自己编写一个。这是一个简单的版本,它绑定

c++ - 类模板的别名

考虑像A这样的别名模板在下面的代码中。现在让B是A的别名模板.在下面的代码中,这些类模板用作结构C的模板参数。仅专门用于一种类型名称(A)。clang-std=c++11与error:implicitinstantiationofundefinedtemplate'C'一起存在表示B的另一个特化是需要的。templateusingA=int;templateusingB=A;templateclassI>structC;templatestructC{};intmain(){Cc;Cd;//clangerror:implicitinstantiation}为什么(如果甚至)是-尽管不允

c++ SFINAE 检查指向类的指针中的方法

我有这样的代码:templateclassDiskFileFlush{TABLELOADER*_loader;public:voidprocess(){//Iwanttocallthis,//onlyifloader->refresh()exists.notifyLoader();}boolnotifyLoader(){if(loader!=nullptr)returnloader->refresh();returnfalse;}};只有loader->refresh()存在时,我才想调用notifyLoader()。我也使用void作为默认类型,有没有更好的方法来做同样的事情?

c++ - 提升多种可能性的变体

假设我有一个模板类,大小超过一种类型:templateclassC{};我想生成一个boost::variant,它能够将此类保存在多种大小和类型上,例如对于大小1和2以及类型int和unsignedint它将是typedefboost::variant,C,C,C>my_variant;问题是我在几个地方需要这个设置,每次都需要不同的大小和类型。是否有一些模板元编程魔法可以从可能值列表中生成这些变体,类似于typedefgenerate_variant::typemy_variant; 最佳答案 好的,我做到了。方法如下:#inc

c++ - 无法获取要在 Visual Studio 和 clang 下编译的模板

我有以下缩小代码。带有//OnlyVS的行在VS上编译但在clang上不编译,带有//Onlyclang的行在clang上编译,但在VS上不编译。谁是正确的?更重要的是,如何在两者上编译等效行?测试的版本是clang3.7.0,VS2015。#include#includetemplateclassC{structB{std::functionfunc;B(std::functionfunc):func(func){}};templatestructD:B{usingB::B;templatevoidCall(T&t,std::index_sequence){func(std::get