草庐IT

if-constexpr

全部标签

c++ - 具有基于参数类列表的使用 constexpr 的字段的 Variadic CRTP 模板类

我已经(在c++11中)编写了一个可变参数模板constexpr函数,它计算参数类型的最大sizeof,例如:maxSizeof()它工作正常。然后我想要一个带有字段的可变参数模板类,该字段是一个大小等于maxSizeof()的数组。这也应该可以正常工作:templateclassMyclass{uint8_tfield[maxSizeOf()]}但我还需要Myclass来为每个参数类型声明方法。我通过以下方式使用CRTP:templateclassMyclass;templateclassMyclass{uint8_tfield[maxSizeOf()]//(1)Couldn'tdo

c++ - 为什么使用 boost::ice_or 而不是 ||和 boost::ice_and 而不是 enable_if 中的 &&?

如问题所述,人们使用结构版本而不是正常条件是否有原因? 最佳答案 摘自BoostCodingGuidelinesforIntegralConstantExpressions:Don'tuselogicaloperatorsinintegralconstantexpressions;usetemplatemeta-programminginstead.Theheadercontainsanumberofworkaroundtemplates,thatfulfiltheroleoflogicaloperators,forexamplei

C++,使用#if TRUE 条件指令

当使用类似#ifTRUE的语句时,我应该期望发生什么?一个解释将不胜感激!我了解#if1的工作原理,但它在我的代码中给出的结果与使用#ifTRUE时完全不同。我理解#if是一个条件指令,它意味着什么;这只是我不明白的TRUE(或FALSE)部分。似乎以这种方式使用它永远不会执行语句后面的代码。这是一个例子:#ifTRUEcout我似乎从来没有看到“真”或“假”打印到屏幕和使用VisualStudio,内部语句自动变灰。 最佳答案 预处理器将包含/排除#if#endifblock的内容,具体取决于#if之后的表达式的计算结果为真还是假

c++ - 我怎样才能在 constexpr 函数中有一个临时变量?

这是我想做的简化版本。constexprfloatf(floata,floatb){constexprfloattemp=a+b;returntemp*temp*temp;}在我的版本中,a+b是更复杂的东西,所以我不想剪切和粘贴它三次。使用3*(a+b)也不是实际功能的有效解决方案。我试图让问题与语法相关,而不是代数。我可以通过将a+b移动到它自己的constexpr函数来让它工作,但我宁愿不要用其他无用的函数污染命名空间。 最佳答案 正如您所发现的,您不能在constexpr函数体内声明变量,甚至是constexpr变量。通过将

c++ - 静态元组类成员的 constexpr 有链接器错误

我有以下代码:#include#includeclassT{public:usingNames=std::tuple;staticconstexprNamesnames{"First","Second"};};intmain(){std::cout(T::names);}因为names是一个constexpr我希望它能工作。但是我收到链接器错误:编译器:>g++--versionConfiguredwith:--prefix=/Applications/Xcode.app/Contents/Developer/usr--with-gxx-include-dir=/usr/include

c++ - 如何在 if-else 阶梯中针对特定条件进行互斥锁定和解锁?

在线程中运行的类的成员函数中,我想保护对if-else阶梯中某些共享资源的访问,如下所示。if(condition){}//themutexlockshouldbehereelseif(specificcondition)//themutexunlockshouldbehere{}else...我希望以上述方式进行锁定,因为除了访问共享资源以评估特定条件之外,我不会在任何地方访问/使用它,并且每个if/elseblock运行的所有操作都非常好长时间运行,我不想阻止其他线程访问该共享资源。我知道作用域锁和互斥锁,但我想不出在这种情况下可以使用它的方法。问题是:使用互斥锁定/解锁语句,甚至

c++ - 使用 constexpr 函数的返回值作为另一个函数的参数

我有一个constexpr函数,它根据字符串文字计算CRC32散列。templateconstexpruint32_tctcrc32(constchar(&str)[len]){returndetail::crc32(str)^0xFFFFFFFF;}(引用其他constexpr函数)我想做的是调用其他一些接受uint32_t值的函数,并使用它来访问某些unordered_map中的数据。这样的调用看起来像这样:uniformByNameCRC32(ctcrc32("uPointLight.position"));我希望"uPointLight.position"的散列在构建时计算一次

c++ - 模板特化 enable_if

我正在尝试以这种方式专门化模板:classPropertyBase{public:SfPropertyBase(stringname){Name=name;}virtual~SfPropertyBase(){}stringName;virtualboolFromString(Object*obj,stringstr)=0;};templateclassProperty:publicSfPropertyBase{public:Property(stringname):SfPropertyBase(name){//specifictoPropertystuff}templatetypena

c++ - 是否有一种非间接、非 hack 的方法来保证 constexpr 函数只能在编译时调用?

目前,我们有两个主要的编译时评估选项:模板元编程(通常使用模板结构和/或变量)和constexpr操作1。templatestructsum_{enum{value=l+r};};//Withstruct.templateconstintsum=sum_::value;//Withstruct&var.templateconstintsub=l-r;//Withvar.constexprintmul(intl,intr){returnl*r;}//Withconstexpr.其中,我们保证所有四个都可以在编译时求值。templatestructCompileTimeEvaluable{

c++ - 旧版本的 C++ 在评估 `int` 语句中的条件时是否使用了类的 `if()` 运算符?

现代版本的C++在评估if()语句中的条件时尝试使用类的bool运算符。其他转换运算符,例如int在不存在bool运算符时使用。如下所示。#includeusingnamespacestd;classTwoInts{public:inta,b;operatorbool(){cout运行这段代码不会产生任何意外:TwoIntstoboolSixIntstoint查看一些旧的C++代码,似乎有一个更改需要验证。旧版本的C++在评估if()语句中的条件时是否使用了类的int运算符?什么版本(如果有)做过某事?那么建议的输出应该是TwoIntstointSixIntstoint关于问题原因的一