草庐IT

应不应该

全部标签

c++ - boost::shared_polymorphic_downcast 在 boost 1.53.0 中消失了。我应该用什么代替?

boost::shared_polymorphic_downcast在boost1.52.0之间消失了和1.53.0.releasenotes中对此没有提及。,并且提交(r81463)仅包含神秘的日志消息“更新shared_ptr转换。”我不清楚我现在应该使用什么,或者为什么删除此功能。有人可以帮忙吗?编辑:感谢大家富有洞察力的评论。我发现自己有点沮丧,因为boost会在没有任何理由或通知的情况下在版本中做出向后不兼容的更改,而且我也感到沮丧的是它们删除了有用的功能。但是根据响应,我可以用两行代码而不是一行代码来完成我想做的事情,所以我认为这就足够了。尽管如此,我仍将这个问题“悬而未决

c++ - 我应该使用手动分配来允许移动语义吗?

我很想知道什么时候应该开始考虑使用移动语义而不是复制数据,具体取决于数据的大小和类的用途。例如,对于Matrix4类,我们有两个选择:structMatrix4{float*data;Matrix4(){data=newfloat[16];}Matrix4(Matrix4&&other){*this=std::move(other);}Matrix4&operator=(Matrix4&&other){...removedforbrevity...}~Matrix4(){delete[]data;}...otheroperatorsandclassmethods...};structM

c++ - 我应该明确地限定变量的范围吗?

这更像是一个风格问题,因为我知道在实践中大多数编译器可能会优化以提供相同的效果,但我一直在阅读,一般来说,您应该始终在它们所处的范围内声明/定义变量被使用。因此,在我无法内联声明的情况下,例如以下代码片段,我考虑过将索引变量括在范围括号中(大括号,不确定在这种情况下您如何调用它们)以便明确地限制这些变量的范围。这是好习惯吗?如果是这样,您能解释一下原因吗?{size_ti=0;//thisvariablehasnouseoutsideoftherange-basedforloopfor(autoconstinput:input_vector){neuron_sequence[i].Fo

c++ - 是否有某些关键字不应该是我的 "#defined"?

我正在用C/C++为我的应用程序开发一个平台层。我愿意#defineWINDOWS//在Windows机器上#defineANDROID//在Android手机上由于与其他库的冲突,定义诸如“WINDOWS”或“ANDROID”之类的非常常见的关键字是不是一个坏主意,是否可以在这些关键字前加一些前缀:#defineMYLIB_WINDOWS//不被任何其他3rdparty库使用#defineMYLIB_ANDROID 最佳答案 Iwouldliketo当心在你的库的头文件中公开带有“通用”名称的宏。还要注意私有(private)代码

c++ - 为什么我应该在 c++ 而不是 c 中设置插件接口(interface)

由于我的previousquestions我问自己:为插件系统设置C++接口(interface)是否有用?以下几点反对它:不同编译器及其版本之间没有共同的ABI,内存中的对象没有共同的布局没有直接类导出。您必须导出工厂和析构函数。如果你的对象被其他对象持有,问题就会出现delete它们,例如智能指针。STL的不同实现,你不能传递std::list到插件使用不同版本的库,例如Boost如果您将自己限制在C++语言的其余部分,您几乎会以“C子集”告终。使用C++有什么要点吗?Qt-Toolkit是如何解决上述问题的?备注:我主要指的是Linux系统。不过,我对其他平台上的解决方案很感兴趣

c++ - 我们是否应该在大型 std::vector 中存储指向类实例的智能指针以获得更好的性能?

当在std::string中存储自定义类(不是“简单”类,例如不是std::complex,不是std::vector等)的大量实例时,我们应该选择一个简单的std::vector还是std::vector>是更好的选择?我写了一些基准代码(从thisblogpost扩展代码,关于C++11在C++03上move语义改进),似乎vector>为1,500,000项vector提供了更好的性能。事实上,在装有Windows764位、IntelCorei5四核CPU和8GBRAM的PC上,我得到了以下结果(test.exe1500):vector>:1.5秒vector>:1.6秒vect

c++ - 我应该看到 std::bind 和 boost::bind 之间的显着差异吗?

我正在探索g++-4.7(具体来说是Ubuntu/Linaro4.7.3-2ubuntu~12.04)对C++11的支持,我似乎发现了差异。特别是,如果我注释掉#include并系统地替换出现的boost::bind与std::bind在BoostASIO异步客户端示例中(取自http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/http/client/async_client.cpp),程序不再编译。有什么解释吗? 最佳答案 #includenamespa

c++ - 我们什么时候应该为 `std::unordered_set` 提供我们自己的哈希函数

当我编译下面的代码时,我看到了与Hash相关的错误。intF_no_meaningA(unordered_set>&setVec,vector&vec){setVec.insert(vec);return1;}intmain(){vectorW{2,3,7};unordered_set>setVec;}$g++--versiong++(Ubuntu/Linaro4.6.3-1ubuntu5)4.6.3$g++$1.cpp-o$1-g-Wall-Weffc++-pedantic-std=c++0x/tmp/ccCQFQ4N.o:Infunction`std::__detail::_Has

c++ - AFAIK,下面的代码不应该编译,但它在 clang 和 GCC 中编译。我在这里错过了什么?

下面的代码显示了一个带有非平凡默认构造函数的类union类(成员y是用brace-or-equal-initializer初始化的),所以如果默认了此类类的默认构造函数,则应根据§12.1/5第一个要点将其删除。也就是说,声明Tt;不应编译,因为unionT没有默认构造函数。但是codecompilesandexecutes在clang和GCC中。#includeunionT{inty{1};floatx;charc;T()=default;};intmain(){Tt;std::cout编辑我上面的问题从一开始就错了,因为unionT不是类union类。我刚刚了解到C++11中的§9

c++ - 我的通用模板应该使用 T 还是 T&&?

我正在处理一个文件,该文件具有给定函数和许多重载,如下所示:inlineXf(ScriptWrappable*impl,Yy,Zz){...}inlineXf(Node*impl,Yy,Zz){...}inlineXf(RawPtrimpl,Yy,Zz){...}inlineXf(constRefPtr&impl,Yy,Zz){...}inlineXf(ScriptWrappable*impl,Yy,Zz){...}inlineXf(constString&impl,Yy,Zz){...}inlineXf(int64_timpl,Yy,Zz){...}templateinlineXf(