草庐IT

c++ - enable_if 不能用于禁用此声明

我显然没有足够的SFINAE经验来处理这个问题。实际上,我的印象是它一直有效到现在,并且在我的代码中到处都出现了这种问题,就像最近半个小时一样。#includeusingnamespacestd;template=100>::type>structmore_than_99{};intmain(){more_than_99c;}它说Notypenamed'type'in'std::__1::enable_if';'enable_if'cannotbeusedtodisablethisdeclaration在与模板声明对应的行上。到底是怎么回事?我一直使用这种语法来启用和禁用我的模板类,它

c++ - if constexpr inside lambda, 不同的编译器行为

考虑以下代码。如果我对ifconstexpr的理解是正确的,则不应编译else分支,因此不应将z()视为错误。#includestructZ{};templatevoidf(Tz){autolam=[z](){ifconstexpr(std::is_same::value){}else{z();}};}intmain(){f(Z{});}在clang和gcc这编译;但对于最新的MSVC,它没有。不幸的是,goldbolt的MSVC太旧了,但在我的机器上完全更新了VS2017,cl/std:c++17产生了:Microsoft(R)C/C++OptimizingCompilerVersi

c++ - 使用嵌套类的奇怪 enable_if 行为(MSVC 编译器错误或功能?)

在调试我的代码一段时间后,我使用enable_if追踪到我的问题的原因是一些意外的模板特化结果:以下代码在VisualStudio2010(和2008)中的DoTest()中断言失败,而在g++3.4.5中则没有。但是,当我从SomeClass中删除模板或将my_condition移出SomeClass的范围时,它也适用于MSVC。此代码是否有问题可以解释此行为(至少部分),或者这是MSVC编译器中的错误?(使用这个示例代码,boost和c++0xSTL版本是一样的)#include#includetemplateclassSomeClass{public:templatestruct

c++ - 带有非类型模板参数的 std::enable_if

您将如何在std::enable_if中使用非类型模板参数比较?我无法弄清楚如何再次执行此操作。(我曾经有过这个工作,但我丢失了代码所以我无法回头看,我也找不到我在其中找到答案的帖子。)预先感谢您对此主题的任何帮助。templateclassMatrix{statictypenamestd::enable_if>::typeIdentity(){Matrixret;for(inty=0;y编辑:修复了评论中指出的缺失括号。 最佳答案 这完全取决于您想在无效代码上引发哪种错误/失败。这是一种可能性(撇开明显的static_assert

c++ - 有没有更好的方法来重写这个丑陋的 switch 和 if 语句组合?

本质上,我有一个Gamma探测器系统,每个探测器被分成4个晶体,在只有2个晶体命中的情况下,我们可以确定该对是垂直还是平行于产生react的平面Gamma射线。在为此编写逻辑的过程中,我写了一个巨大而丑陋的开关语句组合,在每个探测器中检查晶体编号的组合(它们在整个探测器及其晶体阵列中是唯一的)。这是代码,包括有问题的函数。//TheParallelandPerpendiculardesignationsareusedinadditiontotheDouble//designationforthe90degreedetectorsifwegetadiagonalscatterinthos

c++ - 无法编译包含 "if constexpr"的函数模板实例化

抱歉标题含糊不清,但我想不出更好的标题。我写了一个函数来压扁容器:templatevoidflatten(constContainer&container,OutItres){ifconstexpr(std::is_convertible_v::value_type>){for(constauto&value:container){*res=value;++res;}}else{for(constauto&subContainer:container)flatten(subContainer,res);}}我希望它像这样使用:vector>test={{1},{2,3,4},{5,6}

c++ - enable_if 类型不属于某个模板类

TLDR:请参阅最后一段。我为几个模板类定义了一个operator&,如下所示:templatestructClass{Class(Tconst&t){}};templatestructClassAnd{ClassAnd(T_Lhsconst&lhs,T_Rhsconst&rhs){}};templateClassAnd,T_Rhs>operator&(Classconst&lhs,T_Rhsconst&rhs){returnClassAnd,T_Rhs>(lhs,rhs);}templateClassAnd,T_Rhs>operator&(ClassAndconst&lhs,T_Rh

c++ - STL std::remove_if 编译器失败

我无法让std::remove_if进行编译,如您所见,我选择了另一种工作正常的手摇曲柄方法,编译器错误位于列表底部的代码之后。任何帮助将不胜感激。谢谢,汤姆#include#include#include#include#include////Findthelargestcompoundwordcomposed//ofsub-wordsfromalist.////-readlistfromfile.////PsuedoCode:////1.ReadNextWordfromFile.//2.Searchinlistforwordformedfromword.//3.ifFoundinL

c++ - 模板类特化 enable_if 和默认值

鉴于以下templatestructtest{};template::value>::type>structtest{};假设some_trait::value是true,enable_if::type是void,然后选择专业。但是,当出现以下情况时,我的查询与选择有关。template::value,T>::type>structtest{};当enable_if的第二个非空模板参数时为::type提供,非特化模板被选中,即使some_trait::value是true,作为::type是T而不是void,所以没有匹配主模板中的默认值。我的问题是标准中的哪个位置描述了选择模板的顺序,

STL - 找到所有的 find_if 的替代版本,而不仅仅是第一个?

是否有std::find_if的替代版本返回所有找到的元素的迭代器,而不仅仅是第一个元素?例子:boolIsOdd(inti){return((i%2)==1);}std::vectorv;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);std::vector::iteratorit=find_if(v.begin(),v.end(),IsOdd);for(;it!=v.end();++it){std::cout 最佳答案 您可以只使用for循环:for(std