草庐IT

Metaprogramming

全部标签

Boost.Range 的 C++ 元组 - 获取元素类型的元组?

我正在试验Boost.Range和Boost元组。如果我有一个范围元组,我如何键入定义一个元组或相应的元素值?换句话说,我用什么来代替/*?*/:typedefboost::tuples::tuple&,char[]>TupleOfRanges;typedef/*?*/TupleOfElements;我当然可以手工完成,我会写:typedefboost::tuples::tupleTupleOfElements;甚至:typedeftypenameboost::tuples::element::typeRange0;typedeftypenameboost::tuples::eleme

c++ - 在索引处分配 boost::mpl vector_c 元素的惯用方式

我有mpl::vector_c我想“分配”位置3的元素,比如说我想将它设置为30。因此,我必须写一个元函数获取和索引、vector和新值并返回修改后的序列。我最终得到了以下解决方案templateclassassign_element{typedeftypenamempl::begin::typebegin;typedeftypenamempl::advance>::typepos;typedeftypenamempl::erase::typesequence2;typedeftypenamempl::begin::typebegin2;typedeftypenamempl::adva

c++ - 用于检测函数是否存在的 C++ 元函数问题

我遇到了一个我不理解的C++元函数问题。我正在使用C++14编译Apple的clang8.1.0版本。说明问题的工作代码如下。我从其他地方抄袭了一个元功能,我正在尝试使用它。它旨在检测名为“bananify”的函数,这些函数具有传递给元函数的类型的参数。你称之为...BananifyDetector::value如果它可以看到形式声明的函数,它应该返回true...bananify(int)问题是,只有在BananifyFinder的模板定义之前声明要搜索的函数,而不是在它的实例化之前,它才有效。所以在我的示例代码中,我希望两者兼而有之,BananifyFinderBananifyFi

c++ - 类模板,在定义中引用它自己的类型

我想知道关于标准的以下情况,visualstudio2017和GCC哪个是正确的。问题是在类模板second中,visualstudio中的标识符“second”总是指具体类型,但在gcc中它似乎是上下文相关的。GCC示例templatestructtype_list{};templatetypenametmpl>structtmpl_c{templateusingtype=tmpl;};templatestructtemplate_of;templatetypenametmpl,typename...Ts>structtemplate_of>{usingtype=tmpl_c;};t

c++ - 当提供模板参数列表时,继承模板类列表

我正在尝试编写一些元编程代码:继承自某个类foo结果继承自key,key,key,...最简单的方法并不完全有效,因为您不能多次从同一个空类继承。处理“...”部分不是很好(因为它是复制面食),但可以。好的,下面是尝试:templatestructchar_if{typenameTHENtype;};templatestructchar_if{typenameELSEtype;};classemptyClass{};templateclasskey{chargetKey(){returnc;}};templateclassinheritFromAll{typenamechar_if,e

C++和const reference to temporary binding问题(在C++0X中实现D语言传值传引用规则)

我想知道可以在多大程度上模仿C++中按值传递和按引用传递规则的D语言规则。有关背景,请参阅以下两个引用资料(主要是Alexandrescu):http://bartoszmilewski.wordpress.com/category/d-programming-language/page/2/和http://groups.google.com/group/comp.std.c++/msg/303e3bf2407a7609?其中一个关键区别是,在D中,const引用不绑定(bind)(作为非const引用)到临时对象。但是,我不知道有什么方法可以定义泛型类X,从而导致以下代码无法编译:v

c++ - 检查成员是否存在并调用它或什么也不做

我有一个带有init()方法的模板类,如果它存在,则必须调用子类方法。基类的方法init()永远调用。templateclassBase{templatevoidinit(Args...args);Tsubj;explicitBase(){subj=newT();}}templateBase::init(Args...args){invoke_if_exists(args);//需要实现invoke_if_exists模板。算法应该是这样的代码if(method_exists(T::init)){subj->init(Args...);}我需要将它包装到模板中非常感谢。[更新]:让我尝

c++ - 使用 std::enable_if 作为函数参数与模板参数有什么区别?

我想知道使用std::enable_if有什么区别?作为函数参数还是模板参数?我有以下两个函数模板:#includetemplatevoidf_function(T,typenamestd::enable_if_t::value,int>=0){}template::value>>voidf_template(T){}intmain(){intx=1;f_function(x);f_template(x);}产生以下程序集(从https://godbolt.org/g/ON4Rya开始):main:pushq%rbpmovq%rsp,%rbpsubq$16,%rspmovl$1,-4(

c++ - VS2010中解析/实例化模板有问题吗?

请不要介意此代码的长度(只需复制和粘贴)。当你运行它时,它不会在VS2010下编译。为了编译此代码,在structRange中从模板参数和main中删除“classIntType”,而不是:Ranger;制作Ranger;//intisremoved代码:templatestructAssign_Low_High{staticconstintlow_value=0;};//inordertocompileremoveclassIntType,fromtemplateparamsofRangestructtemplatestructRange{static_assert(Assign_L

c++ - 如何确定编译器对元程序做了什么? (对于 boost.proto)

我如何确定我的编译器(g++)使用模板代码做什么?我正在使用boost.proto(一个表达式模板库)在编译时计算一些数学表达式。代码正确地评估了表达式,但我想看看编译器是否已经将表达式扩展为等同于手写的c代码(即消除了所有临时变量),或者是否还有一些进一步的编译时优化待完成。有没有办法查看编译器对模板做了什么?谢谢 最佳答案 有几种方法可以在模板实例化通过后查看C++代码:使用gcc-fdump-tree-original(甚至可以使用-fdump-tree-all查看更多pass)使用ElsaC++解析器:http://scot