小编Mar*_*tin的帖子

为什么对于继承虚函数的类,boost :: optional失败

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)

c++ gcc boost strict-aliasing gcc-warning

5
推荐指数
1
解决办法
767
查看次数

如何通过元素出现次数将多集合排序到容器

我想得到按其出现次数排序的元素.这就是我想出的(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.一样.

编辑:我也需要出现次数,对不起,我忘记了

c++ sorting stl stl-algorithm

5
推荐指数
1
解决办法
2872
查看次数

随机数生成器:它应该用作单例吗?

我在几个地方使用随机数,并且通常在需要时构建一个随机数生成器。目前,我使用 Marsaglia Xorshift 算法将当前系统时间作为种子。现在我对这个策略有一些疑问:如果我使用多个生成器,生成器之间的数字的独立性(随机性)取决于种子(相同的种子相同的数字)。由于我使用时间(ns)作为种子,并且由于这次改变了这个工作,但我想知道仅使用一个单一生成器是否会更好,例如使其可用作单例。这会提高随机数质量吗?

编辑:不幸的是 c++11 还不是一个选项

编辑:更具体地说:我并不是建议单例可以提高随机数质量,而是仅使用一个生成器并播种这一事实。否则,我必须确保不同生成器的种子彼此独立(随机)。极端的例子:我用完全相同的数字播种两个生成器 - >它们之间没有随机性

c++ random design-patterns c++03

5
推荐指数
1
解决办法
3211
查看次数

我可以将复制构造函数设为私有,并仍使用默认实现

我认为这是不可能的,但我不妨问.我可以声明一个私有的Copy-Constructor并仍然使用默认实现吗?

背景:我有一个非常大的向量类,我不想调用复制构造函数,除了一个成员函数.使用标准的公共拷贝可能很容易导致错误,例如在迭代(foreach(Type el,vectOfBigObjects)中忘记引用而不是foreach(Type const& el,vectOfBigObjects)).因此,我想保留标准的复制品,但只是将其设为私有.

这是否可以在不重写copy-ctors定义的情况下实现?

c++ copy-constructor

5
推荐指数
1
解决办法
1485
查看次数

在匿名命名空间中使用命名空间是否安全?

在匿名命名空间内的"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++ namespaces using-directives

4
推荐指数
1
解决办法
755
查看次数

是否有替换auto_ptr可以与c ++ 11中的boost ptr_map一起使用

在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的替代品?

c++ boost c++11

4
推荐指数
1
解决办法
709
查看次数

在使用sed模式之前,如何删除换行/换行符

标题已注明:

我想使用一些Linux一线(例如sed)

转变

Anytext
{
Run Code Online (Sandbox Code Playgroud)

进入

Anytext{
Run Code Online (Sandbox Code Playgroud)

可以使用sed来完成此操作,如果不使用sed则可以使用awk一个内衬来完成?

awk sed

4
推荐指数
1
解决办法
7269
查看次数

如何使用自定义标志编写 ostream 运算符

我经常想将 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)

c++ io operator-overloading stream

4
推荐指数
1
解决办法
1435
查看次数

为什么std :: runtime_error :: what()返回const char*而不是std :: string const&

为什么std::runtime_error::what()返回const char*而不是std::string const&?在许多情况下,直接返回对嵌入字符串的引用会很方便,并且可以避免一些开销.那么,首先不返回例如对内部字符串的const引用而不提供重载函数的理由是什么?我想它也跟着一个字符串ctor也可以抛出一个异常,但是我没有看到返回一个字符串引用的风险.

c++ string exception

2
推荐指数
1
解决办法
1669
查看次数

根据参数类型制作模板功能代码的最简单方法是什么

我想编写一个模板函数来检查一些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.遗憾的是,具有虚函数的解决方案不是一种选择.

c++ templates boost sfinae

1
推荐指数
1
解决办法
152
查看次数