boost :: optional <>适用于简单的数据类型,但只要用于从实现接口的类继承的类,它就会在启用严格别名时失败.
例:
#include <boost/optional.hpp>
struct MyLine{
double a;
double b;
};
class Edge{
public:
MyLine toMyLine() const;
private:
virtual MyLine doToMyLine() const =0;
};
class Wall:public Edge {
public:
Wall(MyLine const& seg):mMyLine(seg){};
private:
MyLine doToMyLine() const{return MyLine();};
MyLine mMyLine;
};
class SimpleWall {
public:
SimpleWall(MyLine const& seg):mMyLine(seg){};
private:
MyLine mMyLine;
};
int main(){
//boost::optional<Wall> res; //fails with strict aliasing error
boost::optional<SimpleWall> res2; //compiles just fine
}
Run Code Online (Sandbox Code Playgroud)
使用gcc版本4.4.3编译以下内容时出错:
g++ -c -pipe -Wall -Wextra -Wunused -Wmissing-declarations -Wpointer-arith -Wcast-align -Wwrite-strings …Run Code Online (Sandbox Code Playgroud) 我想得到按其出现次数排序的元素.这就是我想出的(mHeights是一个std :: multiset):
namespace{
template<class U,class T>
class HistPair{
public:
HistPair(U count,T const& el):mEl(el),mNumber(count){
}
T const& getElement()const{return mEl;}
U getCount()const{return mNumber;}
private:
T mEl;
U mNumber;
};
template<class U,class T>
bool operator <(HistPair<U,T> const& left,HistPair<U,T> const& right){
return left.getCount()< right.getCount();
}
}
std::vector<HistPair<int,double> > calcFrequentHeights(){
typedef HistPair<int,double> HeightEl;
typedef std::vector<HistPair<int,double> > Histogram;
std::set<double> unique(mHeights.begin(),mHeights.end());
Histogram res;
boostForeach(double el, unique) {
res.push_back(HeightEl(el,mHeights.count(el)));
}
std::sort(res.begin(),res.end());
std::reverse(res.begin(),res.end());
return res;
}
Run Code Online (Sandbox Code Playgroud)
所以首先我从multiset中获取所有独特元素,然后我计算它们并将它们分类到一个新容器中(我需要计数,所以我使用了一个映射).对于这么简单的任务来说,这看起来很复杂.除了在其他地方使用的HistPair之外,没有任何stl算法可以简化此任务,例如使用equal_range或sth.一样.
编辑:我也需要出现次数,对不起,我忘记了
我在几个地方使用随机数,并且通常在需要时构建一个随机数生成器。目前,我使用 Marsaglia Xorshift 算法将当前系统时间作为种子。现在我对这个策略有一些疑问:如果我使用多个生成器,生成器之间的数字的独立性(随机性)取决于种子(相同的种子相同的数字)。由于我使用时间(ns)作为种子,并且由于这次改变了这个工作,但我想知道仅使用一个单一生成器是否会更好,例如使其可用作单例。这会提高随机数质量吗?
编辑:不幸的是 c++11 还不是一个选项
编辑:更具体地说:我并不是建议单例可以提高随机数质量,而是仅使用一个生成器并播种这一事实。否则,我必须确保不同生成器的种子彼此独立(随机)。极端的例子:我用完全相同的数字播种两个生成器 - >它们之间没有随机性
我认为这是不可能的,但我不妨问.我可以声明一个私有的Copy-Constructor并仍然使用默认实现吗?
背景:我有一个非常大的向量类,我不想调用复制构造函数,除了一个成员函数.使用标准的公共拷贝可能很容易导致错误,例如在迭代(foreach(Type el,vectOfBigObjects)中忘记引用而不是foreach(Type const& el,vectOfBigObjects)).因此,我想保留标准的复制品,但只是将其设为私有.
这是否可以在不重写copy-ctors定义的情况下实现?
在匿名命名空间内的"using namespace"语句中,询问以下内容是否合法
//file.cpp
//....
namespace
{
using namespace std;
}
int a(){
cout << "bla";
}
Run Code Online (Sandbox Code Playgroud)
答案是"它是".此外,使用命名空间指令通常被鄙视,即使插入cpp文件中也是如此,因为自引入统一构建(/sf/answers/453234211/)以来,头文件和实现文件之间的范围差异并不稳固.
我的问题:匿名命名空间是否使我免于此类问题,或者using指令是否仍能传播文件边框?在/sf/answers/180452331/中,提出了类似的方法.它是否也适用于匿名命名空间,它是否真的安全?当然std是一个糟糕的例子,但例如using namespace boost::assign;在某些cpp文件中会非常方便.
在c ++ 11 auto_ptr中,不推荐使用并且更加明智unique_ptr.唉,如果你使用boost::ptr_map的auto_ptr满足一个非常方便的使用方法:
std::auto_ptr<Layer> pLayer(new Layer());
mRawLayerPtrMap.insert(layerName,pLayer);
Run Code Online (Sandbox Code Playgroud)
是否有可能使用与c ++ 11类似的东西.我知道
Layer* pLayer = new Layer();
mFusedLayers.insert(fusedLayerName,pLayer);
Run Code Online (Sandbox Code Playgroud)
虽然auto_ptr有所作为,但它在一些更复杂的场景中有其优点.是否有适用于C++ 11的替代品?
标题已注明:
我想使用一些Linux一线(例如sed)
转变
Anytext
{
Run Code Online (Sandbox Code Playgroud)
进入
Anytext{
Run Code Online (Sandbox Code Playgroud)
可以使用sed来完成此操作,如果不使用sed则可以使用awk一个内衬来完成?
我经常想将 stl 容器写入 ostream。以下代码工作正常(至少对于向量和列表):
template< typename T ,template<typename ELEM, typename ALLOC=std::allocator<ELEM> > class Container >
std::ostream& operator<< (std::ostream& o, Container<T>const & container){
typename Container<T>::const_iterator beg = container.begin();
while(beg != container.end()){
o << *beg++;
if (beg!=container.end()) o << "\t";
}
return o;
}
Run Code Online (Sandbox Code Playgroud)
现在我想扩展此代码以支持可自定义的分隔符。以下方法显然不起作用,因为运算符应该只采用两个参数。
template< typename T ,template<typename ELEM, typename ALLOC=std::allocator<ELEM> > class Container >
std::ostream& operator<< (std::ostream& o, Container<T>const & container,char* separator){
typename Container<T>::const_iterator beg = container.begin();
while(beg != container.end()){
o << *beg++;
if (beg!=container.end()) o << separator; …Run Code Online (Sandbox Code Playgroud) 为什么std::runtime_error::what()返回const char*而不是std::string const&?在许多情况下,直接返回对嵌入字符串的引用会很方便,并且可以避免一些开销.那么,首先不返回例如对内部字符串的const引用而不提供重载函数的理由是什么?我想它也跟着一个字符串ctor也可以抛出一个异常,但是我没有看到返回一个字符串引用的风险.
我想编写一个模板函数来检查一些Timestamp属性(类继承自Timed),但也必须适用于没有时间戳的类型.我找到的最好(也很难看)的解决方案如下:
class Timed {
protected:
int mTime;
public:
explicit Timed(int time=0): mTime(time){}
int getT() const {return mTime;}
};
template<typename T>
bool checkStale(T const* ptr) const {
return checkStaleImp(ptr, boost::is_base_of<Timed, T>() );
}
template<typename T>
template<bool b>
bool checkStaleImp(T const* ptr, boost::integral_constant<bool, b> const &){
return true;
}
template<typename T>
bool checkStaleImp(T const* ptr, boost::true_type const&){
const int oldest = 42;
return (42 <= ptr->getT());
}
Run Code Online (Sandbox Code Playgroud)
这是一个功能的三个功能.有没有更简单的方法来实现这一点,例如使用boost::is_base_of或某事.类似于if条件或boost :: enable if将函数输出转换为一种常量,用于不派生的类Timed.遗憾的是,具有虚函数的解决方案不是一种选择.