草庐IT

Metaprogramming

全部标签

c++ - SFINAE 检查运算符的存在(没有 decltype)

我正在尝试做我学校的一个旧项目,它处理C++98中的元编程。我挣扎的部分是关于SFINAE。主题说我应该检查operator通过使用这样的结构在流对象和另一个对象之间工作:templatestructIsPrintable;它说我应该用“两个空引用”写一个奇怪的行,我想它应该是这样的:sizeof(*(static_cast(NULL))(NULL)))它在运算符受支持时工作,但在不支持时无法编译。我不知道我在哪里失败了,这是文件:templatestructIsPrintable{typedefcharyes[1];typedefcharno[2];templatestructTes

c++ - 描述这个元程序的内存消耗

我在一本关于元编程的书中找到了这个工作代码-templatestructbinary{staticunsignedconstvalue=binary::value*2+N%10;};templatestructbinary{staticunsignedconstvalue=0;};intmain(){unsignedx=binary::value;cout我的问题是-value的内存分配在哪里?是否分配在数据段上?此外,该书还说这段代码会产生一系列模板实例化,这些实例化以类似于递归的方式计算结果。这是否意味着对于每个模板实例化,都会在数据段上分配一个新的unsigned?

c++ - 是否可以保证包含数组的类的大小?

给定:templatestructval2size{charplaceholder[N];};是否可以保证sizeof(val2size)==N? 最佳答案 唯一的保证是sizeof(val2size)>=N在结构的末尾可能有未命名的填充。我不认为会有未命名的填充,但这是可能的。 关于c++-是否可以保证包含数组的类的大小?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/3647

c++ - 有没有办法找出一个类是否是另一个类的直接基础?

我想知道是否有一种方法可以查明一个类是否是另一个类的直接基础,即在Boost类型特征术语中是is_direct_base_of函数。据我所知,Boost似乎不支持这种功能,这使我认为当前的C++标准是不可能的。我想要它的原因是对用于反射系统的两个宏进行一些验证检查,以指定一个类派生自另一个类,如下面的示例代码所示。标题.h:#defineBASEA#defineDERIVEDBclassA{};classB:publicA{#include};rtti.h://Iwanttocheckthatthetwomacro'sarecorrectwithacompiletimeassertRt

c++ - 在 C++ 中使用模板是什么意思

最近,我在别人的源代码中遇到了一些东西。我不太了解C++中的模板。你能帮我吗?structmy_grammar:publicgrammar{...};为什么my_grammar可以像它一样用作类型参数?最好的问候, 最佳答案 这是一个叫做奇怪的重复模板模式的成语-参见http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern.总之,它提供派生类作为基类的策略,其风格类似于Alexandrescu的《现代C++设计》一书中使用的策略(强烈推荐)。这样,基类可以使用

c++ - Concepts lite是否会改变CRTP实现静态多态的需求?

自从几年前我发现了CRTP以来,我在很多地方都使用它来为非常密集的面向计算的代码实现编译时多态性。当一个人关心运行时的通用性和最大性能时,以通用方式将成员函数“注入(inject)”到类中是很棒的。我在conceptslite上阅读/观看了几件事这将是(我希望)下一个C++标准的一部分。以更抽象和通用的方式设计功能绝对很棒,避免了我目前使用的SFINAE/std::enable_if的糟糕行。我还没有测试过实现概念的g++分支来玩弄它们,并以一种新的方式研究我喜欢的元编程方法。但也许你们中的一些人有。我的第一个想法是概念不会解决静态多态性的问题,但由于这类事情可能严重依赖技巧,我可能是

c++ - 我可以在这里避免模板递归吗?

我为元组写了一个for_each:templateenable_if_t::valuefor_each(Tuple&,F&&){}template::value>enable_if_t::value>=end>for_each(Tuple&t,F&&f){f(get(t));for_each(t,forward(f));}[LiveExample]但是Yakk'sanswertothisquestion给出了一个很好的例子,说明如何处理在所有tuple值上运行lambda非递归:namespacedetail{templatevoidfor_each_arg(F&&f,Args&&..

c++ - 刚刚向 TMPing 介绍自己,发现了一个怪癖

当我在VS2008中编写这段简短的代码时,我只是想学习初学者的语法,以及它是如何工作的。下面的代码适用于将数字1加到499,但是如果我将1加到500,编译器会出错:fatalerrorC1001:编译器发生内部错误。我只是想知道为什么会这样。编译器可以生成多少代码或其他东西是否有一些限制,它恰好是一个很好的整数500对我来说?#includeusingnamespacestd;templatestructloop{enum{sum=loop::sum+b};};templatestructloop{enum{sum=0};};intmain(){cout::sum

c++ - 成员数量可变的结构或类

我想创建一个具有可变数量类成员的结构/类,这可以在编译阶段决定(就像在模板元编程中完成的那样)示例:假设要同时指定类型和变量名称,例如TypeT1变量名称应为varName1等等......templateMyClass{T1varName1;}templateMyClass{T1varName1;T1varName2;}在主代码中可以像下面这样声明或者可以指定类型和名称的其他方式我的类对象;和MyClass::somefunc()可以访问变量名如下MyClass::somefunc(){std::cout是否可以通过C++中的模板元编程来同时指定类型和变量名?

c++ - 是否可以使用元编程将所有常规编程任务转换为编译时间?

我阅读了有关元编程的内容,发现它真的很有趣。例如,检查数字是否为质数,计算斐波那契数...我很好奇它的实际用法,如果我们可以将所有运行时解决方案转换为元编程,应用程序的性能会好得多。假设要找到数组的最大值。如果未排序,我们将在运行时采用O(n)。是否有可能通过元编程获得O(1)?谢谢,陈 最佳答案 你不能,因为元编程只适用于编译时已知的输入。因此,您可以拥有一个元函数,在给定编译时已知常数的情况下计算斐波那契数:intvalue=Fibonacci::Value;但它不适用于用户在运行时输入的值:intinput=GetUserIn