草庐IT

if-elseif-else

全部标签

c++ - 在 if 语句中 && 的后半部分进行无效操作是否安全?

这样安全吗:if(sprite->numberOfSides!=0&&sprite->value%sprite->numberOfSides!=0)如果sprite->numberOfSides可以==0?我问的原因是,如果我像这样构建if语句:if(sprite->value%sprite->numberOfSides!=0&&sprite->numberOfSides!=0)我得到一个异常(因为你不能n%0)。将其反转为前一个语句效果很好,但我不想在为不同设备编译时遇到麻烦。 最佳答案 是的,它很安全。短路由标准保证。这意味着如

c++ - enable_if 中的短路运算符

我想编写一个模板化函数,它接受array或int[3].我试图在enable_if中捕获它:templateenable_if_t&&extent_v==3U||!is_array_v&&tuple_size::value==3U>foo(constT¶m){}不幸的是int[3],tupple_size未定义,这会导致模板在评估短路之前无法编译。我也尝试使用conditional来做到这一点但这有确保两个选项都对T有效的相同问题在考虑条件之前。我知道我可以通过特化来做到这一点。但是函数体中的代码是完全相同的。我讨厌这样的事实,即当实现相同时我就专攻了。有没有办法在评估条件之前

成员运算符的 C++ enable_if(或解决方法)

templatestructfoo{T*p;foo(T*x):p(x){}~foo(){if(p)deletep;}T&operator*()const{return*p;}};intmain(){fooi(newint);foov(newint);//如果T=void,那么我不想实现operator*()。我怎样才能做到这一点?我不想特化该类,因为我的类中还有许多其他方法。PS:请注意,这只是解释我的问题的示例。 最佳答案 您可以将所有其他方法(它们与T==void配合得很好)移动到一个基类中,并使foo从它派生。然后foo可以特

c++ - C++ 标准中的 if..else 语句

来自C++标准第6.4.1节:if语句:Ifthecondition(6.4)yieldstruethefirstsubstatementisexecuted.Iftheelsepartoftheselectionstatementispresentandtheconditionyieldsfalse,thesecondsubstatementisexecuted.Inthesecondformofifstatement(theoneincludingelse),ifthefirstsubstatementisalsoanifstatementthenthatinnerifstatem

c++ - 将 std::enable_if 从参数移动到模板参数

我基本上是在尝试做与std::enable_if:parametervstemplateparameter相同的事情但我无法编译我的代码。我有一个简单的第一个版本,它的参数中有std::enable_if,并且工作正常:#include#includetemplatevoidfoo(Tt,typenamestd::enable_if::value>::type*=0){std::coutvoidfoo(Tt,typenamestd::enable_if::value>::type*=0){std::cout但我认为,如果将模板内容放在一个地方并希望函数参数中包含enable_if可能会

c++ - 带有 is_enum 的 enable_if 不起作用

MCVE:#includetemplateboolfunc(typenamestd::enable_if::value,T>::type&t,intx){}enumclassBar{a,b,c};intmain(){Barbar{Bar::a};func(bar,1);}我希望func(bar,1);符合我对func的定义,但是g++报告:sfi.cc:Infunction'intmain()':sfi.cc:13:17:error:nomatchingfunctionforcallto'func(Bar&,int)'func(bar,1);^sfi.cc:13:17:note:can

c++ - 创建并验证指向 "if"语句的指针

这段代码是否正确?voidfoo(int*p){if(int*p2=p)//single"="{*p2++;}}我一直认为它不是,但最近我在同事的我的资源中看到了这样的代码。如果“p”为NULL怎么办?MSVS2008工作正常但显示“警告C4706:条件表达式中的赋值”。谢谢。 最佳答案 警告assignmentwithinconditionalexpression通常由编译器发出,以防止您编写的情况if(a=b){你的意思if(a==b)//bigdifference!{在您的示例中,“分配警告”实际上是伪造的,因为它实际上不是分

c++ - 条件运算符总是可以被 if/else 替换吗?

直到现在我还在想条件运算符inta=b==2?x1:x2;始终可由if/else语句替换。inta;if(b==2)a=x1;elsea=x2;两者之间的选择总是一个品味问题。今天我正在处理一项任务,如果我可以写的话,引用将会很有用:int&a;if(b==2)a=x1;elsea=x2;这是不允许的,我尝试使用条件运算符初始化引用。这很有效,我开始意识到,条件运算符并不总是可以用if/else语句替换。我的结论对吗? 最佳答案 你是对的。条件运算符是一个表达式,而if-else是一个语句。可以用语句的地方可以用表达式,反之则不然。

c++ - std::remove_if 移除的元素到哪里去了?

reference说是templateForwardItremove_if(ForwardItfirst,ForwardItlast,UnaryPredicatep);Iteratorspointingtoanelementsbetweentheoldandthenewendsoftherangearestilldereferenceable,buttheelementsthemselveshaveunspecifiedvalues.我尝试了这个简单的程序来找出“未指定的值”的含义。#include#include#include#includeintmain(){std::vecto

c++ - find_if 不适用于 const_iterator

我写了这个程序://splitsasentenceintowords#include#include#include#include"spacefunc.h"usingstd::string;usingstd::cout;usingstd::endl;usingstd::find_if;intmain(){typedefstring::const_iteratoriter;stringinput="Thisisme";iteri=input.begin();while(i!=input.end()){iterj;i=find_if(i,input.end(),notspace);j=f