草庐IT

C++ : how do I use type_traits to determine if a class is trivial?

在C++0x中,我想确定一个类是否简单/是否具有标准布局,以便我可以使用memcpy()、memset()等...我应该如何使用type_traits实现下面的代码,这样我才能确认一个类型是微不足道的?templateboolisTrivialType(){boolisTrivial=???returnisTrivial;}注意:is_pod()限制太多:我希望我的类有简单的构造函数等......为了方便。补充:我认为std::is_standard_layout可能会给我我正在寻找的东西。1.如果我添加构造函数,它仍然返回true2.如果我添加一个虚方法,它返回false这是我需要确

c++ - Hook : why do we need to VirtualProtect() again to restore permissions?

这是一些标准的代码片段,我们在其中安装了钩子(Hook),在我们感兴趣的函数的开头重写了一些字节。我的问题是:为什么我们需要重新保护一block重写的内存?我们不能只保留PAGE_EXECUTE_READWRITE权限吗?我们在这里假设我们需要不断地恢复原始字节并再次重新Hook。if(VirtualProtect(funcPtr,6,PAGE_EXECUTE_READWRITE,&dwProtect))//makememorywritable{ReadProcessMemory(GetCurrentProcess(),(LPVOID)funcPtr,Hook::origData,6,

c# - 嵌入式单声道 : How do you raise an event in C++?

我正在开发一个嵌入了Mono的应用程序,我想将一个事件从C++层引发到C#层。这是我拥有的:void*itr(NULL);MonoEvent*monoEvent;while(monoEvent=mono_class_get_events(klass,&itr)){if(0==strcmp(eventName,mono_event_get_name(monoEvent)))raiseMethod=mono_event_get_raise_method(monoEvent);}但是,raiseMethod总是返回NULL。查看MonoEvent的结构,似乎填充了add和remove方法,但

C++ 在迭代 : standard solution is not working? 时删除列表成员

这是我的问题。我已经阅读了许多以前关于如何在迭代列表成员时删除列表成员的问题,并且我尝试了答案提出的各种解决方案。碰巧他们似乎不起作用。我有一个此类的列表:classWalker{public:Walker(int);~Walker();double*x;double*y;double*z;doubleweight;intmolteplicity;};构造函数和析构函数如下Walker::Walker(intparticle_num){x=newdouble[particle_num];y=newdouble[particle_num];z=newdouble[particle_num

C++ Lambda、捕获、智能 Ptr 和堆栈 : Why Does this Work?

我一直在研究C++11中的一些新特性,并尝试编写以下程序,但预计它不会运行。令我惊讶的是,它确实如此(在带有'std=c++0x'标志的Linuxx86上的GCC4.6.1上):#include#include#includestd::functioncount_up_in_2s(constintfrom){std::shared_ptrfrom_ref(newint(from));return[from_ref](){return*from_ref+=2;};}intmain(){autoiter_1=count_up_in_2s(5);autoiter_2=count_up_in_

c++ - 通过无效指针访问静态成员 : guaranteed to "work"?

这个问题在这里已经有了答案:C++staticconstaccessthroughaNULLpointer[duplicate](5个答案)关闭8年前。设置给定这个用户定义的类型:structT{staticintx;inty;T():y(38);};并将必要的定义放在有用的地方:intT::x=42;以下是将int的值流式传输到stdout的规范方法:std::cout控制同时,由于T的实例不存在,以下内容(当然)无效:T*ptr=NULL;//sameifleftuninitialisedstd::couty;问题现在考虑以下可怕、邪恶和糟糕的代码:T*ptr=NULL;std::

C++ 范围-v3 库 : 'take' -ing first 3 perfect numbers works and halts; 'take' -ing first 4 doesn't stop after 4

据我了解,range-v3库的View操作(目前需要C++17,但要成为C++20中STL的正式部分)提供了可链接的类STL算法,这些算法是延迟计算的。作为实验,我创建了以下代码来评估前4个完全数:#include#includeusingnamespacestd;intmain(intargc,char*argv[]){autoperfects=ranges::view::ints(1)|ranges::view::filter([](intx){intpsum=0;for(inty=1;y代码以可能无限范围的数字开始(ranges::view::ints(1)),但是因为View算

c++ - 为什么 myClassObj++++ 不会产生编译错误 : '++' needs l-value just as buildin type do?

为什么myint++++使用VS2008编译器和gcc3.42编译器编译得很好??我期待编译器说需要左值,示例见下文。structMyInt{MyInt(inti):m_i(i){}MyInt&operator++()//returnreference,returnalvalue{m_i+=1;return*this;}//operator++needit'soperandtobeamodifiablelvalueMyIntoperator++(int)//returnacopy,returnarvalue{MyInttem(*this);++(*this);returntem;}in

c++ - 为什么在 C++ 中通过空指针 "work"调用方法?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:CallingclassmethodthroughNULLclasspointer#includeusingnamespacestd;classtest{inti;public:test():i(0){coutshow();return0;}很明显,不会调用任何构造函数。这是标准吗?或者只是一些编译器优化,因为这个指针没有在show()成员函数中使用?

c++ - 什么 SAFESEH :NO option actually do

我正在尝试使用boost::asio::spawn函数,就像在example中一样,但它在Release中给我以下错误:libboost_context-vc120-mt-s-1_55.lib(jump_i386_ms_pe_masm.obj):errorLNK2026:moduleunsafeforSAFESEHimage很明显,我应该在项目设置中设置/SAFESEH:NO选项,但我不明白这实际上会做什么。这如何影响程序中异常处理的行为(C++异常和SEH)?顺便说一句,我正在使用MSVC-12.0。 最佳答案 简短回答:禁用Sa