草庐IT

三元表达

全部标签

c++ - 转换表达式模板树

给定一个表达式模板树,我想在处理它之前创建一个新的优化树。考虑以下乘法运算示例:a*b*c*d,由于operator*的从左到右的结合性,它产生了表达式树:(((a*b)*c)*d).我想生成一个转换后的表达式树,其中乘法从右到左发生:(a*(b*(c*d))).考虑二进制表达式类型:templatestructBinaryTimesExpr{BinaryTimesExpr()=default;BinaryTimesExpr(constBinaryTimesExpr&)=default;BinaryTimesExpr(BinaryTimesExpr&&)=default;BinaryT

c++ - 三元 vector 的快速内积

考虑两个vector,A和B,大​​小为n,7nA和B都只包含-1、0和1。我需要一个计算A和B内积的快速算法。到目前为止,我一直在考虑使用以下编码将符号和值存储在单独的uint32_t中:符号0,值0→0符号0,值1→1符号1,值1→-1。我想到的C++实现如下所示:structternary_vector{uint32_tsign,value;};intinner_product(constternary_vector&a,constternary_vector&b){uint32_tpsign=a.sign^b.sign;uint32_tpvalue=a.value&b.valu

c++ - Lambda 表达式作为 C++14 中的类模板参数

问题Lambdaexpressionsasclasstemplateparameters询问使用lambda表达式作为类模板参数的可能性。问题的答案是否定的。然而,它是关于C++11的。新标准C++14中的情况是否发生了变化? 最佳答案 不,C++14中的情况根本没有改变,事实上5.1.2Lambda表达式段落2已收紧:Alambda-expressionshallnotappearinanunevaluatedoperand(Clause5).到:[...]Alambda-expressionshallnotappearinanu

c++ - 使用枚举作为常量表达式。哪个编译器是正确的?

以下代码使用枚举成员m作为常量表达式,即作为模板参数。代码在gcc下编译但不在clang(livedemo)下编译。Clang说“错误:非类型模板参数不是常量表达式”。问题可以通过交换线路//1来解决通过A::m>a.因此,我的问题不是如何解决这个问题,而是哪个编译器是正确的。templatestructA{};templatestructtst{enum:size_t{m=n%15};templatevoidcall(tstconst&t2){Aa;//1}}; 最佳答案 根据标准,Clang拒绝代码是正确的。t2.m是类成员访问

c++ - C++14 中泛型 Lambda 中的依赖表达式和 ODR 使用

voidf(int,constint(&)[2]={}){}//#1voidf(int,constint(&)[1]){}//#2//voidf(constint&,constint(&)[1]){}//#2_originalvoidtest(){constintx=17;autog=[](autoa){f(x);//OK:calls#1,doesnotcapturex};autog2=[/*=*/](autoa){intselector[sizeof(a)==1?1:2]{};f(x,selector);//OK:isadependentexpression,socapturesx?

C++ 表达式模板生命周期

我在https://en.wikipedia.org/wiki/Expression_templates查看表达式模板的示例.然后我尝试制作一个简单的符号表达式树,即添加常量和变量,如a+b+10。所以我从#includetemplateclassExpression{public:std::ostream&print(std::ostream&os)const{returnexpression().print(os);}Econst&expression()const{returnstatic_cast(*this);}};classVar:publicExpression{publ

c++ - 表达式模板 - 修饰名称长度超出

我从我的代码中收到“超出装饰名称长度”的警告我查看了类似问题的SO答案。*注意我知道如何关闭它(pragma),我也知道这是一个我可以“忽略”的警告,基于unix的编译器可能不会发出它:P*这个问题有一个实际因素,如果我遇到错误,我必须费力地浏览一些非常可怕的文本和模板。这些错误目前主要是由于拼写错误造成的,但如果我有任何细微的问题,那么真正找到问题所在将是一场噩梦。我的代码可以编译并运行,但正如我上面所说的,我收到了警告。我有一个“比较”小的表情...autoexpression=(l,aComma,w,aComma,x,aComma,y,aComma,z);std::cout我从我

c++ - ‘const’ 错误之前的预期主表达式

请帮忙。我收到很多错误。sub2.cpp:在函数“intmain()”中:sub2.cpp:11:14:错误:从‘constchar*’到‘char’的无效转换[-fpermissive]sub2.cpp:12:14:错误:从‘constchar*’到‘char’的无效转换[-fpermissive]sub2.cpp:16:17:错误:'const'之前需要主表达式sub2.cpp:16:36:错误:'const'之前需要主表达式sub2.cpp:11:6:警告:未使用的变量“外部”[-Wunused-variable]sub2.cpp:12:6:警告:未使用的变量‘inner’[-W

C++:检查表达式是否编译的模板

在使用SFINAE编写模板特化时,您经常会因为一个不存在的小成员或函数而需要编写一个全新的特化。我想将此选择打包成一个小声明,如orElse.小例子:templateintget(T&v){returnorElse();}这可能吗? 最佳答案 orElse()的意图很清楚,但如果这样的事情可能存在,它必须是以下之一:召唤阵容orElse(v,&V::get,0)orElse(v,0)orElse(v)哪里v类型为V,以及由此实例化的函数模板分别是:函数模板阵容templateintorElse(T&obj,int(T::pmf*)(

c++ - Rust 中有类似表达式模板的东西吗?

在C++中,表达式模板是一种技术,它依赖于编译器对C++代码中表达式的了解来简化它们并优化它们,使其超出过程程序中的可能范围。这是一种强大的技术,例如,Eigen和Armadillo矩阵库,以加速矩阵上的某些复合运算。一个incompletewikipageontheEigenwebpage几乎要开始解释了。我想知道Rust中是否存在类似的技术,即是否有办法让Rust编译器在编译时优化某些表达式,以便创建最少数量的临时对象。 最佳答案 如果我阅读ExpressionTemplates是的,然后您可以看到它们与Rust迭代器一起运行: