草庐IT

封装和static

全部标签

c++ - 未定义的行为会影响 static_assert 吗?

考虑以下代码:SomeTypex=getX();for(automask=1u=sizeofx,"Typeofnumericparameteristoolong");/*...*/}此处,mask的类型为unsigned。假设SomeType是longlong。然后mask的初始化将由于移位太多而具有未定义的行为。但是OTOH,有一个static_assert,它检查未定义的行为不会在运行时发生(因为代码将无法编译)。但由于UB会导致时间悖论和其他意外情况,我不太确定static_assert能否保证在这种情况下实际工作。有什么理由可以确定这一点吗?或者是否应该重做此代码以使stati

c++ - constexpr std::array with static_assert

#include#includeintmain(intargc,char**argv){constexprconststd::arrayarr{{0,1}};constexprconstintarr2[]={0,1};static_assert(arr[0]==arr2[0],"asdf");static_assert(arr[1]==arr2[1],"asdfasdf");return0;}当使用gcc4.8.2和4.9.1使用g++test.cpp--std=c++11编译时,编译成功。但是,当使用clang++test.cpp--std=c++11使用clang3.4和3.5编译

c++ - 为什么我应该更喜欢类中的 static constexpr int 而不是类级整数常量的枚举?

C++17更新:staticconstexpr变量是隐式内联,因此不需要外部定义。原始问题:假设我有一个常量列表,例如structCls{staticconstexprintN=32;staticconstexprintM=64;};这当然建议我为这些添加定义以避免可能发生的ODR使用问题,因此我需要:constexprintCls::N;constexprintCls::M;为什么应该我更喜欢这个structCls{enum:int{N=32,M=64};};这让我免于ODR使用的麻烦,因为N和M更真实地只是常量,而不是对象本身(如果这是标题,那就更重要了-only)并且更短。我可以

C 语言函数宏封装妙招

1.函数宏介绍函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。函数宏本质上为宏,可以直接进行定义,例如:#defineINT_SWAP(a,b)\inttmp=a;\a=b;\b=tmp但上述的宏具有一个明显的缺点:当遇到 if、while 等语句且不使用花括号仅调用宏时,实际作用范围在宏的第一个分号后便结束。即 a=b 和 b=tmp 均不受控制语句所作用。因此,在工程中,一般使用三种方式来对函数宏进行封装,分别为 {}、do{...}while(0) 和 ({})。下文将一一对三种方式进行分析,比较各自的优劣点。2.{

【C++】哈希表封装unordered系列

 文章目录前言一、哈希表的封装总结前言在看本篇文章前大家尽量拿出上一篇文章的代码跟着一步步实现,否则很容易引出大量模板错误而无法解决。一、哈希表的封装首先我们要解决映射的问题,我们目前的代码只能映射整形,那么如何支撑浮点数等的映射呢?只需要多加一个模板参数就可以了:template structHashNode { HashNode*_next; pair_kv; HashNode(constpair&kv) :_kv(kv) ,_next(nullptr) { } }; template structHashFunc { size_toperator()(constK&k

c++ - static_cast 到相同类型会引入运行时开销吗?

我有一个结构模板,它采用两种类型(T和S),并且在某些时候使用static_cast从一种类型转换键入另一个。通常情况下,T和S是同一类型。设置的简化示例:templatestructfoo{voidbar(Tval){/*...*/some_other_function(static_cast(val));/*...*/}};在S与T是同一个类的情况下,static_cast是否会引入额外的开销,或者它是否为null哪个操作总是会被忽略?如果它确实引入了开销,是否有一个简单的模板元编程技巧来仅在需要时执行static_cast,或者我是否需要创建部分特化来处理T==S案例?如果可能,

c++ - VC2010 的 static init 线程安全吗?

我一直在SO和MSDN周围寻找这个问题的答案,但似乎找不到明确和最终的答案......我知道它在C++11标准中并且当前的GCC版本以这种方式运行,但是VC2010目前是否保证局部静态变量初始化的线程安全?即:这对于VC2010是线程安全的吗?staticS&getInstance(){staticSinstance;returninstance;}...如果不是,当前使用VC2010在C++中实现线程安全单例的最佳实践是什么?编辑:正如ChrisBetti的回答所指出的,VC2010没有实现局部静态变量init的线程安全。 最佳答案

c++ - 具有多个参数的 boost::static_visitor

typedefboost::variantType;classAppend:publicboost::static_visitor{public:voidoperator()(int){}voidoperator()(double){}};Typetype(1.2);Visitorvisitor;boost::apply_visitor(visitor,type);是否可以更改访问者,使其接收如下额外数据:classAppend:publicboost::static_visitor{public:voidoperator()(int,conststd::string&){}voido

c++ - 是否有可能 static_assert lambda 不是通用的?

我实现了一个Visit函数(在变体上),它检查变体中当前事件的类型是否与函数签名(更准确地说是第一个参数)匹配。基于这个不错answer.例如#include#include#includetemplateArgfirst_argument_helper(Ret(*)(Arg,Rest...));templateArgfirst_argument_helper(Ret(F::*)(Arg,Rest...));templateArgfirst_argument_helper(Ret(F::*)(Arg,Rest...)const);templatedecltype(first_argum

c++ - 整数数组的位封装

我有一个整数数组,假设它们是int64_t类型。现在,我知道只有每个整数的前n位是有意义的(也就是说,我知道它们受到某些界限的限制)。以删除所有不必要空间的方式转换数组的最有效方法是什么(即我在a[0]处有第一个整数,在a处有第二个整数[0]+n位等等)?我希望它尽可能通用,因为n会不时变化,但我猜可能会有针对特定n的智能优化,例如2或某事的幂。当然我知道我可以迭代valueovervalue,我只是想问问你StackOverflowers是否可以想出一些更聪明的方法。编辑:这道题不是关于将数组压缩到尽可能少的空间。我只需要从每个整数中“剪切”n位并给定数组,我知道我可以安全剪切的确切