草庐IT

Metaprogramming

全部标签

c++ - 元整数平方根中的无限递归

你好,我的一位friend询问如何将整数平方根函数转换为元函数。这是原始函数:unsignedisqrt(unsignedvalue){unsignedsq=1,dlt=3;while(sq>1)-1;}我用constexpr写了一个meta版本,但是他说因为某些原因他不能使用这个新特性:constexprstd::size_tisqrt_impl(std::size_tsq,std::size_tdlt,std::size_tvalue){returnsq>1)-1;}constexprstd::size_tisqrt(std::size_tvalue){returnisqrt_im

c++ - 努力实现类型列表

出于教育目的,我想编写自己的基于c++11的类型列表。裸列表如下所示:templatestructtype_list;templatestructtype_list{typedefTHead;typedeftype_listTail;};templatestructtype_list{typedefTHead;typedefnull_typeTail;};我创建了一个名为front的函数来提取第一个元素:templatestructfront;templatestructfront{typedeftypenameTypeList::Headtype;};按预期工作,即这段代码typed

c++ - C++ 模板的替代品?

我认为元编程非常酷。我尤其喜欢lisp宏。但是,我认为C++模板很糟糕,因为:1.它们会减慢编译时间(如果包含任何STL内容,即使预编译的header最终会达到50MB)。2.它们给出了与直觉相悖的可怕的编译器/语法错误3.他们一开始就不是为复杂的元编程设计的(为素数生成编译器错误/显示模板图灵完整在当时是一件大事)。说了这么多,C++元编程是否有合适的替代方案?像*.m->元编译器->*.cpp->g++->可执行文件?编辑:我在考虑“自定义代码生成脚本”。我只是想知道那里是否有一组非常好的。 最佳答案 我不确定这是应该的,我已经

c++ - 在通用编程/TMP 世界中,模型/策略和 "concept"究竟是什么?

我想在一处了解这三个概念的精确而简洁的定义。答案的好坏应该取决于以下两点。展示一个简单的代码片段来展示这个概念/技术的用途和用途。足够简单易懂,以便没有接触过该领域的程序员也能掌握。注意:可能有很多正确答案,因为每个概念都有许多不同的方面。如果有很多好的答案,我最终会将问题转化为CW并汇总答案。--发布接受编辑--Boost有一个很好的article关于泛型编程概念 最佳答案 概念是对一种类型的一组要求。例如,您可以有一个名为“RandomAccessible”的概念,它要求在O(1)时间内实现operator[](int)的类型。

c++:从模板参数生成字符串文字

templatestructt{staticconstchar*s;};templateconstchar*t::s=...;其中...是“012...i-1”,例如i==5的“01234”。这可能吗?(请不要在运行时执行此操作!)出于好奇而提出的问题(使用预处理器宏/常量很容易,但是模板参数如何)?含义是:编译时生成的字符串字面量。我现在看到const不会强制执行此操作,但可以采用任何运行时评估函数来生成字符串。 最佳答案 这在技术上是可行的,只是非常非常难看。下面是一个为unsignedint生成字符串文字的示例。它(还)不会创

c++ - 如何在转换运算符中使用 std::enable_if?

基本上我希望我的范围类型可以从Range隐式转换至Range.std::enable_if似乎是不可能的,因为该函数不带任何参数并且没有返回值。解决办法是什么?这基本上是我尝试过的:templateclassRange{T*begin_;T*end_;public:Range(T*begin,T*end):begin_{begin},end_{end}{}templateRange(T(&a)[N]):begin_{static_cast(&a[0])},end_{static_cast(&a[N-1])}{}T*Begin(){returnbegin_;}T*End(){return

c++ - Ratio<,> 是常量,但如果我想接受不同的比率作为参数怎么办?

也许是一个矛盾的问题:ratio根据定义,是一个编译时常量。但是,我想构建具有不同比率的持续时间,这些比率可以由我的方法的调用者指定。我想我应该使用比率和/或持续时间以外的东西,但是什么?比方说,我想要一个可以在运行时设置的类成员,并且我希望它的类型为ratio。在代码中的某个位置,这个成员被设置/分配,它会被分配一个恒定的比率,但在我的类(class)中,我不想指定该比率应该是多少。 最佳答案 好的,你需要一个std::ratio“可以由调用者指定”。共有三个不同的选项:调用者想要设置std::ratio编译时期间的模板参数。这很

C++ 元编程 - 在代码中生成错误

有没有一种方法可以创建一个采用int模板参数的函数,如果传递给该函数的值小于10,该函数会给出编译时错误?下面的代码不起作用,但它显示了我想要完成的事情:templatevoidreportErrorIfLessThan10(){#if(number1();//reportanerror!reportErrorIfLessThan10();//okreturn0;} 最佳答案 如果你不想BoostC++Libraries魔术和想要裸露的骨头......templateclassstatic_check{};templateclass

c++ - 平方根元函数?

是否可以使用具有以下签名的元函数计算整数的平方根:templateinlinedoublesqrt();(或者可能使用constexpr关键字,我不知道什么是最好的)。这样,sqrt()将被1.414...取代在编译时。这种功能的最佳实现是什么? 最佳答案 这可能不是您想要的,但我想确保您意识到通常通过优化,编译器无论如何都会在编译时计算结果。例如,如果您有以下代码:voidg(){f(sqrt(42));}使用g++4.6.3和优化-O2,生成的汇编代码是:9000083EC1Csubl$28,%esp110003DD050000

c++ - `struct decay<T, R(A..., ...)>`是什么意思

templatestructdecay{usingtype=R(*)(A...,...);};它的确切含义是什么?我需要一些帮助~ 最佳答案 intfoo(int);intbar(int,...);这是两个不同的功能。foo是int(int)类型。bar的类型为int(int,...)。...是C风格的可变参数,不要与同样使用...的可变模板参数混淆。templatestructdecay{usingtype=R(*)(A...,...);};这部分是boost::hana中std::decay优化版本的实现。typenameT和T