我使用大量用C++编写的计算代码,考虑到高性能和低内存开销.它大多使用STL容器vector,并且几乎在每个函数中遍历那些容器.
迭代代码如下所示:
for (int i = 0; i < things.size(); ++i)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
但它会产生签名/未签名的不匹配警告(Visual Studio中的C4018).
替换int某种unsigned类型是一个问题,因为我们经常使用OpenMP pragma,它需要计数器int.
我即将压制(数百个)警告,但我担心我错过了一些优雅的解决方案.
在迭代器上.我认为在适当的地方应用迭代器很棒.我正在使用的代码永远不会将随机访问容器更改为list某种东西(因此迭代int i已经是容器不可知),并且总是需要当前索引.您需要键入的所有其他代码(迭代器本身和索引)只会使问题复杂化并模糊底层代码的简单性.
当我希望将控件绑定到我的对象的属性时,我必须提供属性的名称作为字符串.这不是很好,因为:
是否有一个设计模式可以解决这个问题,但仍然易于使用数据绑定?
(这是WinForm,Asp.net和WPF中的一个问题,很可能是很多其他系统)
我现在已经找到了" C#中的nameof()运算符的变通方法:typesafe databinding ",它也是解决方案的一个很好的起点.
如果您在编译代码后愿意使用后处理器,那么notifypropertyweaver非常值得关注.
当绑定在XML而不是C#中完成时,任何人都知道WPF的良好解决方案吗?
有没有比在IntelliJ中的类源文件中重新排序方法更简单的方法,而不是手动剪切和粘贴代码?现在我经常在重构遗留代码时需要这个,例如在源代码中移动相关的方法.
在Eclipse AFAIK中,有一个类似于IntelliJ的Structure视图的视图,我可以在其中拖放方法.但是,这在IntelliJ中不起作用,我也无法从其帮助中找到任何提示.
我使用IntelliJ 9.0.2是具体的.
如果我想覆盖一些方法,我现在右键单击类名,选择"Source" - >"Override/impl ...".
是否有快捷方式或其他方式在Eclipse中更快地完成此操作?
鉴于c ++许多程序员提供的新工具集,旨在实现代码简化,表达性,效率,浏览旧代码并进行调整(有些无意义,有些成功)以实现他们的目标.尽管不要在这些工作上浪费太多时间,只是做出非侵入性和自包含的变化,但最佳做法是什么?
让我勾勒出明显的:
使用auto运行基于迭代器的循环:
for (std::vector<foo>::const_iterator it(lala.begin()), ite(lala.end()); it != ite;
++it);
// becomes
for (auto it(lala.cbegin()), ite(lala.cend()); it != ite; ++it);
Run Code Online (Sandbox Code Playgroud)使用tie来进行多个赋值,这些赋值只产生C风格的代码行(如何一次将多个值分配到结构中?)
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
// becomes
std::tie(a, b, c, d, e) = std::make_tuple(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)要使类不可继承,只需将其声明为"final"并删除实现此类行为的代码http://www.parashift.com/c++-faq/final-classes.html
使用delete关键字显式隐藏构造函数/析构函数,而不是将它们声明为私有(例如,用于创建基于堆的对象的代码,不可复制的对象等)
创建简单的仿函数只是为了将单个STL算法的执行变为lambda函数(除了减少代码混乱,你还能保证内联调用)
仅使用智能指针简化对象的RAII包装
摆脱bind1st,bind2nd只需使用bind
用<type_traits>提供的标准代码替换类型特征的手写代码(Is_ptr_but_dont_call_for_const_ptrs <>等:))
停止包含现在在STL中实现的函数的boost标头(BOOST_STATIC_ASSERT vs static_assert)
为类提供移动语义(虽然这不符合脏/快/易更改的条件)
在可能的情况下使用nullptr而不是NULL宏,并删除填充指针的容器的代码,其中0已转换为对象类型
std::vector<foo*> …Run Code Online (Sandbox Code Playgroud)我目前正在重构/整理C++项目中使用的一些旧C代码,并定期查看以下函数:
int f(void)
Run Code Online (Sandbox Code Playgroud)
我倾向于写作:
int f()
Run Code Online (Sandbox Code Playgroud)
是否有任何理由不在整个代码库中用()替换(void)以提高一致性,或者两者之间是否存在我不知道的细微差别?更具体地说,如果C++中的虚拟成员函数被描述为:
virtual int f(void)
Run Code Online (Sandbox Code Playgroud)
派生类包括成员函数:
int f()
Run Code Online (Sandbox Code Playgroud)
这是一个有效的覆盖?另外,基于几乎相同的签名,我是否可能遇到任何链接器问题?
我有一堆我要重命名的课程.其中一些名称很小,名称在其他类名称中重复使用,我不希望更改名称.其中大部分都存在于Python代码中,但我们也有一些引用类名的XML代码.
简单的搜索和替换只能让我到目前为止.在我的情况下,我想将AdminAction重命名为AdminActionPlug和AdminActionLogger为AdminActionLoggerPlug,因此第一个的搜索和替换也会错误地击中第二个.
有没有人有Python重构工具的经验?如果他们也可以修复XML文档中的类名,则可以获得奖励积分.
我正在做一些架构清理,涉及将一堆类移动到不同的项目和/或命名空间.目前我正在手动移动文件,构建,然后根据需要手动添加使用Foo语句来解决编译错误.有人知道这样做的更聪明的方法吗?(我们是CodeRush和Refactor!商店,但我很想知道Resharper是否支持这个)
我在15K LOC C++项目中使用C风格的强制转换,90%的时间用于子类和基类之间的强制转换.
即使我读到使用它们是不好的,并且它们可能导致严重的错误,因为它们不像C++演员那样安全,我仍然觉得使用它们非常精细和舒适.
到目前为止,我没有遇到过我的项目中的一个错误,例如,一个意外错误的C-Style演员 - 真的.
我没有使用它们有两个主要原因:
我的问题:
我使用C++为我提供的所有其他优点,包括虚拟和抽象基类,命名空间,STL等,而不是新的类型转换语法." 你为什么不只是使用C呢? " 这个论点对我来说不起作用.
如何找到生产中正在运行的代码?
该应用程序经过了充分测试,但有很多测试可以测试未使用的代码.因此,他们在运行测试时得到报道......我想重构和清理这个烂摊子,它不断浪费我的时间.我有很多背景工作,这就是为什么我想要制作环境来指导我.在heroku运行我可以旋转dynos以补偿探查器对性能的影响.
相关问题如何在Ruby应用程序中找到未使用的方法?没有用.
额外奖励:用于显示运行代码行的频率的指标.不知道为什么我想要它,但我做到了!:)