草庐IT

constexpr-if-else

全部标签

c++ - 可能的模板和 constexpr——如果不兼容

我想在编译时计算e值(别担心,不是家庭作业),但出了点问题。template,size_tfactorial=1,size_tcount=1>constexprdoublee_impl(){ifconstexpr(limit==0){returnstatic_cast(result{}.num)/result{}.den;}returne_impl>,factorial*count,count+1>();}虽然计算值是正确的,但编译器会抛出有关模板溢出的错误。似乎limit变量超出了范围(低于0),但它不应该发生,因为0–情况正在被处理ifconstexpr(...)语句。所以问题是,

c++ - 如何实现类似 std::copy_if 但在插入到不同容器之前应用函数的方法

完全公开,这可能是一个锤子和钉子的情况,在不需要的时候尝试使用STL算法。我在我正在使用的一些C++14代码中看到了一个重新出现的模式。我们有一个迭代的容器,如果当前元素符合某些条件,那么我们将其中一个元素字段复制到另一个容器。模式是这样的:for(autoit=std::begin(foo);it!=std::end(foo);++it){autox=it->Some_member;//Note,thecheckusuallyusesthefieldwouldaddtothenewcontainer.if(f(x)&&g(x)){bar.emplace_back(x);}}这个想法几

c++ - constexpr 函数是隐式静态的吗?

如果我在我的program.cpp中定义一个函数:constexprboolisThree(constintnumber){returnnumber==3;}这与声明它为静态有什么不同吗?staticconstexprboolisThree(constintnumber){returnnumber==3;}看起来这些应该是等价的,因为constexpr意味着函数是内联的,因此不在编译单元之间共享。constexpr全局函数是隐式静态的吗? 最佳答案 constexpr函数是隐式内联。inline是一种链接功能。在不同编译单元中定义的

c++ - 是否编译了带有 if(this==NULL) 测试的类函数?

我在我们的实验中看到了这段代码片段,它实际上是在MSVC2008和G++中编译的。voidLinkList::Insert(Tn){if(this==NULL)//somecodehere}据我所知,this不能为null,因为如果未实例化,则不能在C++中调用类函数。这是一个有效的代码吗?如果是这样,背后的原因是什么?它可以用在什么地方? 最佳答案 sinceyoucannotcallaclassfunctionsinc++ifitwasn'tinstantiated问题是,你可以,但它leadstoundefinedbehavi

c++ - clang 3.3 和 GCC 4.7 const v 的 constexpr

我刚刚尝试在Ubuntu13.04上使用带有GCC4.7.3标准库头文件的clang3.3编译大量代码。这一切都很顺利,除了一个问题。这段代码已经在这台机器上用标准的Ubuntuclang3.2包编译,所以我假设这是clang3.3编译器的一些变化。与使用复杂header的const和constexpr有关的问题。特别是复杂类型具有以下代码块#ifdef__GXX_EXPERIMENTAL_CXX0X__//_GLIBCXX_RESOLVE_LIB_DEFECTS//DR387.std::complexover-encapsulated.constexprdoublereal(){re

c++ - enable_if 添加具有默认参数的函数参数?

我无法理解呈现的第二种情况here.它说:•Scenario2:Addingafunctionparameterthathasadefaultargument:templateyour_return_type_if_presentyourfunction(args,enable_if_t=BAR){//...}Scenario2leavestheparameterunnamed.Youcouldsay::typeDummy=BAR,butthenameDummyisirrelevant,andgivingitanameislikelytotriggeranunreferencedpar

c++ - 使用带有匿名类型参数的 std::enable_if

我尝试将std::enable_if与未使用和未命名的类型参数一起使用,以免扭曲return类型。但是,以下代码无法编译。#includetemplate::value>>Tfoo(){std::cout::value>>Tfoo(){std::cout();foo();}编译器说:7:3:error:redefinitionof'templateTfoo()'4:3:note:'templateTfoo()'previouslydeclaredhereInfunction'intmain()':11:12:error:nomatchingfunctionforcallto'foo()

类型的 C++ constexpr 值

我希望能够通过类型的ID创建switch语句。我发现了一种可以为不同类型提供唯一ID的机制。非常简单:templatestructtype{staticvoidid(){}};templateconstexprconstsize_ttype_id(){returnreinterpret_cast(&type::id);}我认为这会评估为一个常量,我可以将其用作开关的案例。但是当我执行以下操作时出现错误,即case表达式不是常量:intmain(void){size_ta=type_id();switch(a){casetype_id():break;}return0;}为什么不是常量?

c++ - 重载函数以获取 true_type 或 false_type 参数与使用 if 检查?

与使用一个if语句相比,重载方法/函数以采用true_type或false_type参数有什么好处吗?我看到越来越多的代码使用带有true_type和false_type参数的重载方法。使用if语句的简短示例voidcoutResult(boolmatch){if(match)cout与使用重载函数相比:voidcoutResult(true_type){cout 最佳答案 您的第二个示例代码无法编译,这是编译时重载解析和运行时条件分支之间“选择”哪个不同的症状要执行的代码。“重载函数以获取true_type或false_type参

c++ - 大 if else 语句

如果有一个大的(大约100多个)ifelse语句,如下所示,并且ifelse条件可能是不规则的(例如,一些依赖于3个变量,一些依赖于4个),有没有办法让它变得更简单?基本上我有一个大约100多行的表,其中a、b、c和d作为列。基于a、b、c和d,我需要执行3种不同类型的功能。该表描述了一组业务规则。uint8a;uint8b;uint16c;uint8d;if(a==1&&b==1&&c==0){functionA();}elseif(a==5&&b==5&&c==2&&d==2){functionB();}elseif(a==1&&(b==36||b==7)&&c==0){funct