草庐IT

Metaprogramming

全部标签

c++ - 选择模板参数包中的每个偶数(或奇数)参数

我想允许使用我正在编写的类作为模板参数指定类型列表以及这些类型的分配器列表,其方式是类型位于奇数位置,分配器位于偶数位置:templateclassMyClass{//Stuffinside}intmain(){MyClassc1;MyClassc2;MyClassc3;//Andsoon....}在内部,存储类型vector的元组是有意义的:std::tuple...>m_storage_;和一个分配器元组用于使用:std::tuple...>m_storage_;我如何在代码中实际声明这些元组?理论上我需要以某种方式选择参数包中的每个奇数/偶数类型-这可能吗?

c++ - 实现Matlab的冒号: operator in C++ expression templates class

我正在实现一个C++表达式模板库。我已经设置了一个适当的SubMatrixExpr类来收集矩阵中的元素,启用类似的语法B=SubMatrix(A,1,3,2,10);相当于Matlab的B=A(1:3,2:10);当然,Matlab的语法比我的要舒服得多。所以我的问题是有没有可能在C++中设置Matlab的冒号:运算符?非常感谢您。 最佳答案 简短的回答:没有。冒号不是有效的C++运算符,因此不能重载。即使可以,它仍然不可能轻松实现您的需求,因为它肯定会优先于逗号运算符,这将使您的表达式位于A((1:3),(2:10))行中。,如果

用于调用 printf 的 C++11 编译时格式字符串文字构造

我想做的是创建:templateintprintln(Args...){//implementationwhichcalls://printf("",args...);//additionalperkwouldbecompiletimetypechecking//Iexpecttoprovideaformatstringforeachtypebysometemplate//specialization.}我一直在用编译时字符串文字分析两个有趣的工作:编译时内存对齐的字符串文字https://stackoverflow.com/a/22067775/403571100%constexpr

c++ - enable_if 和互斥方法

我不明白为什么下面的代码不起作用。编译器(gcc)似乎同时实例化了两者方法,显然整数是有符号或无符号的,所以总是失败。我虽然enable_if在这里是为了避免这种情况。问:为什么编译出错,如何避免?usingnamespaceboost;//orstdasyouwanttemplatestructtest{//ifsignedtemplate,int>::type=0>test&operator,int>::type=0>test&operatorx;xetc.testy;yetc.} 最佳答案 SFINAE仅适用于immediat

c++ - 没有定义的结构模板的目的是什么?

下面是Boost.Python的sourcecode的片段:templatestructnull_ok;//how'sitworking?templateinlinenull_ok*allow_null(T*p){return(null_ok*)p;}前向声明的结构null_ok没有定义,null_ok与模板参数T无关。p>在Pythonwiki,一些提示:handley(null_ok(x))allowsytobecomeNULLhandley(x),wherexisnottheresultofnull_ok,neverresultsinaNULLy.Anexceptionwillb

c++ - 内部类的模板特化

考虑以下代码:structX{templateclassY{};};templateclassX::Y{};这里我们专门针对double类型的Y类,代码运行良好。问题是,如果我将代码更改为:templatestructX{templateclassY{};};templateclassX::Y{};编译器会报错:'X::Y':explicitspecializationisusingpartialspecializationsyntax,usetemplateinstead!有人知道在这种情况下我如何专攻Y类吗? 最佳答案 如果不显

c++ - 为模板类的实例分配唯一的数字标识符

核心问题:我希望能够获取模板类的实例,例如:templateclassfoo;foo;然后做类似的事情:foo::value;//Evaluatestoauniquenumberfoo::value;//Evaluatestoadifferentuniquenumberfoo::value;//Evaulatestothesameuniquenumber除了,真的,它是:templateintgetUniqueIdentifier(){returnfoo::value;}当前的解决方案尝试:我在想我想使用Boost::MPL的“可扩展关联序列”,因为每个元素都有自己的唯一标识符,但我认

c++ - 使用 TMP 预计算值何时真正有用?

“EffectiveC++”中的ScottMeyers指出了执行以下操作的能力:编译器中的矩阵运算作为在模板类/函数中实现某些算法的原因。但是这些函数不能对在运行时确定的参数进行操作,显然——它们只适用于写入程序或最多作为参数提供给编译器的数字。程序编译后,每次运行时都会使用相同的输出值。在那种情况下,为什么不使用常规(非模板)程序计算该值,并在必要时将其写入原始程序呢?它不是更快来计算例如1000点。编译器中的fft肯定比常规程序要好。我能想到的最好办法是,如果您需要为不同的客户端编译不同版本的程序,那么TMP可能会为您节省一些时间。但这种需求真的会出现吗?

c++ - 如何只设置一个存在的成员?

编辑:抱歉,这个问题是重复的。原文:SFINAEtocheckforinheritedmemberfunctions我有一个模板函数(在一个用于测试的类中):templatevoidInitHandler(CHandler&handler){handler.setId(0);handler.SetCache(m_pCache.get());handler.m_pScience=m_pScience;}但是,可能会使用没有m_pScience成员的模板参数调用此函数。我能否使用模板元编程仅在该成员存在时设置该成员? 最佳答案 重新想象

c++ - 用自己的函数转换 mpl vector

我想将mpl::vector中的每个元素相乘通过int.首先,一个将int_相乘的元函数用int.templatestructmultiply_scalar{templatestructapply{typedefint_type;};};这是我要调用的电话。typedefvector,int_>my_vec;typedeftypenametransform>::typemy_vec_2;typedefvector,int_>my_vec_3;BOOST_MPL_ASSERT((boost::is_same));//Fails//typeofmy_vec2is:boost::mpl::v