草庐IT

Metaprogramming

全部标签

c++ - 如何从指向方法的指针获取类(对象类型)

我有一个指向方法的指针:structA{intmethod(){return0;}};autofn=&A::method;我可以通过std::result_of获取返回类型,但是如何从fn获取方法的类所有者? 最佳答案 试试这个:templatestructMethodInfo;templatestructMethodInfo//methodpointer{typedefCClassType;typedefRReturnType;typedefstd::tupleArgsTuple;};templatestructMethodInf

c++ - 从元组生成元组

假设您有一个元组,并希望通过对第一个元组的每种类型应用元函数来生成一个新元组。完成这项任务最有效的C++元函数是什么?是否也可以使用C++0x可变参数模板来提供更好的实现? 最佳答案 这个怎么样:templatestructmod;//usingameta-functionclasstemplateclassTuple,typename...Types>structmod>{typedefTuple::type...>type;};然后typedefstd::tupletuple_foo;structadd_pointer{temp

c++ - 用于重复代码的 C/C++ 宏

有什么办法可以用宏重复一段C代码N次吗?N也是一个宏。例如,如果我有这个宏:#defineN5#defineCOODE"nop\n\t"#defineREPEAT[...]当我调用repeat时,预处理器写入CODEN次,所以__asm__(REPEAT);会变成__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");我有一个Arduino,它必须等待一个确切的(而且很小,大约10-15)个时钟。每个“nop”(无操作)只需要1个时钟周期来执行,它什么也不做。我不能只做一个循环,因为每个循环都在不止一个操作中执行(初始化计数器,递增

使用模板与内联的 C++ 元编程

是否值得编写如下代码来复制数组元素:#includeusingnamespacestd;templatestructRepeat{staticvoidcopy(int*x,int*y){x[START+N-1]=y[START+N-1];Repeat::copy(x,y);}};templatestructRepeat{staticvoidcopy(int*x,int*y){x[START]=y[START];}};intmain(){inta[10];intb[10];//initializefor(inti=0;i::copy(a,b);//showfor(inti=0;i还是使用

c++ - 为什么使用 boost::ice_or 而不是 ||和 boost::ice_and 而不是 enable_if 中的 &&?

如问题所述,人们使用结构版本而不是正常条件是否有原因? 最佳答案 摘自BoostCodingGuidelinesforIntegralConstantExpressions:Don'tuselogicaloperatorsinintegralconstantexpressions;usetemplatemeta-programminginstead.Theheadercontainsanumberofworkaroundtemplates,thatfulfiltheroleoflogicaloperators,forexamplei

c++ - 除了模板之外,还有其他 C++ 元编程替代方案吗?

我一直在大量使用元编程,但有时仅结合使用C宏和模板是不够的。如果元编程平台仅适用于linux等,我认为缺点可能是缺乏跨平台兼容性。是的,除了模板之外,现在还有这样的东西吗?元编程的谷歌搜索以模板元编程为主,所以现在很难找到..编辑:这是我一直在做的事情的一个例子。假设我有一个通用类,用于将文件保存到缓冲区或从缓冲区加载文件。我们称它为FilePack。我有一个定义宏,看起来像defineFilePack(BaseClass,"code-a")它基本上创建了一个名为“BaseClassPack”的类,该类被定义为一个子类。下面是那个东西。classFilePack{public:char

c++ - 将 MPL vector 转换为静态数组

我写了一些代码来生成一个boost::mpl::vector用作阶乘函数的查找表,作为对开发人员可能使用的更通用的库函数的测试能够以静态基元数组的形式生成查找表。该函数(最有可能实现为预处理器宏定义)将接受要初始化的数组的名称和大小,以及用作初始化每个元素的元函数的类模板的名称i的数组。我认为在不使用外部脚本的情况下执行此操作的最佳方法是创建一个boost::mpl::vector,如下面的代码list所示,并将数组中每个元素的用户提供的元函数的返回值推送到vector;使用vector的元素初始化静态数组(可能通过使用一系列宏,最后一个宏将使用__VARARGS__宏来完成此操作)。

c++ - 为什么boost mpl set允许非唯一类型

我相信我对boost::mpl::set的理解存在根本性的缺陷。我以为它只允许唯一类型。但是下面的代码可以编译:#include#include#include#include#include#include#include#includeusingnamespaceboost::mpl;typedefsetmy_set;//longrepeatedinset?typedefvectormy_vec;//seemsreasonabletypedefaccumulate,plus>>::typeset_size;typedefaccumulate,plus>>::typevec_size

c++ - 注册一个 C++ 类,以便稍后一个函数可以遍历所有已注册的类

我正在尝试编写一个在运行时动态加载其扩展的应用程序。我使用Boost预处理器库编写了一个预处理器函数,给定一个名称列表,为每个名称声明一个类(并使它们成为某个AbstractPlugin类的子类),然后声明一个包含这些类的BoostMPL序列。然后我写了一个类,如果它可以转换为该MPL序列中的任何类型,它会尝试指向AbstractPlugin的指针。这里的问题是我的预处理器函数需要我想要创建和加载的所有扩展的完整列表。是否有某种技术可以让我在单独的文件中注册每个扩展?更新:我认为,我对情况的解释过于模糊,所以我决定更具体一些。我想定义一个扩展类型的集合。对于每种扩展类型,可以有任意数量

c++ - For 遍历模板参数/类型

我想为几种可能类的几种组合编写基准代码。如果我自己编写每个组合,它就会变得无法维护。因此,我正在寻找一种通过模板自动组合每种类型的方法,类似于以下伪代码:for(typenameHashFuction:Sha256,Sha512,Sa512_256,Sha3_256,Sha3_512){for(typenameKeyingWrapper:TwoPassKeyedHash,OnePassKeyedHash,PlainHash){for(typenameInstantiatedGetLeaf:GetLeaf,GetLeaf){for(typenamealgorithm:algA,algB,