小编use*_*066的帖子

如何使用shared_ptr创建克隆方法并从enable_shared_from_this继承

我已经看到了编写一个返回boost :: shared_ptr的克隆方法的有用方法

class A
{
public:
  shared_ptr<A> Clone() const
  {
    return(shared_ptr<A>(CloneImpl()));
  }
protected:
  virtual A* CloneImpl() const
  {
    return(new A(*this));
  }
};

class B : public A
{
public:
  shared_ptr<B> Clone() const
  {
    return(shared_ptr<B>(CloneImpl()));
  }
protected:
  virtual B* CloneImpl() const
  {
    return(new B(*this));
  }
};
Run Code Online (Sandbox Code Playgroud)

这允许使用与常规指针的协方差,同时仍将其包裹在智能指针的安全性中.我的问题是我的类B需要从boost :: enable_shared_from_this继承,因为在构造之后它需要用一个单独的类注册自己,将共享指针传递给它自己.我有一个Create方法,它包装构造和注册,以确保它们总是一起出现.但是,上述克隆方法实现无法处理此要求.注册不能在CloneImpl中发生,因为没有shared_ptr存在"拥有"该对象,阻止调用shared_from_this(),如果该逻辑不在虚函数中,则指向B的shared_ptr不知道B的注册需求什么时候克隆 处理这个问题的最佳方法是什么?

c++ shared-ptr

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

在For循环中发生了什么GCC优化?

使用gcc 4.6和-O3,我使用简单的时间命令计时以下四个代码

#include <iostream>
int main(int argc, char* argv[])
{
  double val = 1.0; 
  unsigned int numIterations = 1e7; 
  for(unsigned int ii = 0;ii < numIterations;++ii) {
    val *= 0.999;
  }
  std::cout<<val<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

案例1在0.09秒内运行

#include <iostream>
int main(int argc, char* argv[])
{
  double val = 1.0;
  unsigned int numIterations = 1e8;
  for(unsigned int ii = 0;ii < numIterations;++ii) {
    val *= 0.999;
  }
  std::cout<<val<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

案例2在17.6秒内运行

int main(int argc, char* argv[])
{
  double val = 1.0;
  unsigned int numIterations = …
Run Code Online (Sandbox Code Playgroud)

c++ gcc

7
推荐指数
2
解决办法
600
查看次数

将函数指针非类型模板参数转换为类型模板参数

以下示例代码在gcc下编译并按我希望的方式工作.它允许我使用函数定义作为模板参数来实例化一个对象,但是该类能够使用函数中的不同类型,就像它们作为类型模板参数单独传递一样.

template<class FuncSignature> class Obj;

template<class Type1, class Type2> class Obj<Type1 (Type2)>
{
public:
  Type1 var1;
  Type2 var2;
};

int main(int argc, char **argv)
{
  Obj<char (int)> A;
  A.var1 = 'a';
  A.var2 = 3;
}
Run Code Online (Sandbox Code Playgroud)

即使它似乎工作,我不知道这个代码是做什么的.为什么这段代码有效并且符合C++标准?

c++ templates

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

模板子类覆盖父类的虚函数

下面的代码用gcc v4.3.3编译,并且模板化的子类似乎覆盖了父级中的虚函数,但是这不会破坏你不能拥有虚拟模板函数的规则吗?或者是其他发生的事情,我不明白?

class BaseClass
{
public:
  virtual void Func(int var)
  {
    std::cout<<"Base int "<<var<<std::endl;
  }

  virtual void Func(double var)
  {
    std::cout<<"Base double "<<var<<std::endl;
  }
};

template <class TT>
class TemplateClass : public BaseClass
{
public:
  using BaseClass::Func;
  virtual void Func(TT var)
  {
    std::cout<<"Child TT "<<var<<std::endl;
  }
};

int main(int argc, char **argv)
{
  BaseClass a;
  TemplateClass<int> b;
  BaseClass *c = new TemplateClass<int>;

  int intVar = 3;
  double doubleVar = 5.5;

  a.Func(intVar);
  a.Func(doubleVar);
  b.Func(intVar);
  b.Func(doubleVar);
  c->Func(intVar);
  c->Func(doubleVar);
  delete c;
}
Run Code Online (Sandbox Code Playgroud)

然后输出: …

c++ virtual templates

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

如何保存C++ 0X随机数生成器的状态

我与新的C++ 0x随机库中玩耍,并在此基础上的问题:
什么是获得的C++ 0x随机数生成器的状态的标准呢?
似乎如果你不知道随机生成器当前状态的种子,保存其状态的唯一方法是将生成器存储在流中.为此,我写了以下内容

#include <iostream>
#include <sstream>
#include <random>

int main(int /*argc*/, char** /*argv*/)
{
  std::mt19937 engine1;
  unsigned int var = engine1(); // Just to get engine1 out of its initial state
  std::stringstream input;
  input << engine1;
  std::mt19937 engine2;
  input >> engine2;
  std::cout<<"Engine comparison: "<<(engine1 == engine2)<<std::endl;
  std::cout<<"Engine 1 random number "<<engine1()<<std::endl;
  std::cout<<"Engine 2 random number "<<engine2()<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这输出

发动机比较:1
发动机1随机数581869302
发动机2随机数4178893912

我有几个问题:

  • 为什么engine1和engine2的下一个数字不同?
  • 为什么两个引擎比较相同,即使它们的下一个数字不同?
  • 在我的示例中我做错了什么以及保存随机引擎状态以便在以后的运行中获得可重复性的正确方法(假设您不知道种子设置所需的状态)?

谢谢.

random c++11

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

如何最好地实现具有相互依赖类型的模板类

作为一个简化的例子,如果我有类

template <class T, class U> class ProcessEvent
{
  public:
    ProcessEvent(T* t) : var1(t) { var2 = new U; }
    Process() { var2->Process(var1); }
  private:
    T* var1;
    U* var2;
};

class Foo 
{
  /*data*/
};

class FooProcessor 
{
  void Process(Foo* foo) {/*functionality*/}
};

class Bar
{
  /*data*/
};

class BarProcessor 
{
  void Process(Bar* bar) {/*functionality*/}
};
Run Code Online (Sandbox Code Playgroud)

所以ProcessEvent类可以有两组不同的模板类型,

ProcessEvent<Foo, FooProcessor>
ProcessEvent<Bar, BarProcessor> 
Run Code Online (Sandbox Code Playgroud)

但是,第二个模板类型FooProcessor和BarProcessor直接由第一个模板类型暗示,并且是用户不关心的实现细节.我的目标是拥有与上面相同的功能,但让ProcessEvent只采用一个模板参数,Foo或Bar.除了通过ProcessEvent的专业化,这可以做到吗?

c++ c++11

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

标签 统计

c++ ×5

c++11 ×2

templates ×2

gcc ×1

random ×1

shared-ptr ×1

virtual ×1