小编Dan*_*anS的帖子

使用配对累积的问题

我正在使用双端队列,因此我可以为我的数据生成滚动平均值和差异.我将n和n ^ 2作为一对存储在双端队列中,然后使用累积与我自己的运算符+().

#include <deque>
#include <numeric>
#include <utility>

template <typename T1, typename T2>
std::pair<T1,T2> operator+(const std::pair<T1,T2>& lhs, const std::pair<T1,T2>& rhs)
{
   return std::pair<T1,T2>(lhs.first + rhs.first, lhs.second + rhs.second);
}

namespace resource 
{
template <typename T>
class rollingStats
{
public:
   rollingStats(unsigned int n, const T& val):
      xs(n, std::pair<T,T>(val, val*val))
   {;}
   ~rollingStats()
   {;}

   T getMean(void) const
   {
      std::pair<T,T> sum = std::accumulate(xs.begin(), xs.end(), std::pair<T,T>((T)0,(T)0));
      return sum.first / xs.size();
   }

   T getVar(void) const
   {
      const unsigned int n = xs.size();

      std::pair<T,T> sum = …
Run Code Online (Sandbox Code Playgroud)

c++ stl numeric

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

使用模板而不是开关

我想在我的代码中执行一组类似的测试,但仅根据参数进行更改.

我可以用switch语句写这个:

bool doTest(EnumSensorFamily family, const StructSensorProposal& proposed)
{
  switch (family)
  {
  case FAM1:
    return (ExpectedFam1 == proposed.Fam1SensorId);
    break;
  case FAM2:
    return (ExpectedFam2 == proposed.Fam2SensorId);
    break;
  case FAM3:
    return (ExpectedFam3 == proposed.Fam3SensorId);
    break;
  default:
    ERROR ("Unexpected family");
    return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

我想用模板特化来做这件事

template <EnumSensorFamily family>
bool doTest(const StructSensorProposal& proposed);

template<>
bool doTest<FAM1> (const StructSensorProposal& proposed)
{
  return (ExpectedFam1 == proposed.Fam1SensorId);
}

template<>
bool doTest<FAM2> (const StructSensorProposal& proposed)
{
  return (ExpectedFam2 == proposed.Fam2SensorId);
}

template<>
bool doTest<FAM3> (const StructSensorProposal& proposed)
{ …
Run Code Online (Sandbox Code Playgroud)

c++ templates

8
推荐指数
2
解决办法
6631
查看次数

在两个枚举之间重载强制转换操作符

有没有办法重载一个强制转换操作符来转换两个枚举?

在我的代码中我有

enum devStatus
{
    NOT_OPERATING,
    INITIALISING,
    DEGRADED,
    NORMAL
};

enum dataStatus
{
    UNAVAILABLE = 1,
    DEGRADED,
    NORMAL
}
Run Code Online (Sandbox Code Playgroud)

其中NOT_OPERATING和INITIALISING映射到UNAVAILABLE; DEGRADED和NORMAL直接映射.这些由外部接口修复.

我正在寻找一种转换方式devStatus,dataStatus并希望能够写出类似的东西:

devStatus devSts;
getDeviceStatus(&devSts);
dataStatus dataSts = (dataStatus)devSts;
Run Code Online (Sandbox Code Playgroud)

我知道,如果这些是课程,我可以写devStatus::operator dataStatus()这样做.有没有办法为枚举这样做?

我可以有一个免费的功能 dataStatus devStatus2dataStatus(const devStatus& desSts)

c++ enums casting

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

修复(锁定)std :: vector的大小

有没有办法固定矢量的大小,仍然改变内容?

我试过制作一个const向量,const std::vector<int> vec(10);但这阻止我改变值.

vec[3] = 3; 给出编译器错误:分配只读位置.

我还尝试使用const引用非const向量

std::vector<int> vec(10);
const std::vector<int>& vecref(vec);
Run Code Online (Sandbox Code Playgroud)

这给出了相同的编译器错误.

我希望能够在声明或初始化阶段之后修复矢量大小.我可以使用旧式阵列,但我希望能够使用矢量算法.

如果这有任何区别,我正在使用g ++.

c++ size locking const vector

6
推荐指数
2
解决办法
4900
查看次数

我怎么能禁止在C++代码的某些部分使用"new"?

是否可以防止在代码中的某些点使用new?

我正在开发的遗留代码要求在引导程序完成后没有动态内存分配.我们现在想测试一下.

如果我从头开始开发,那么我可以编写自己的包装器并使用它,或者在公共基类中重载operator new.

有没有办法重载全局新的然后调用它?

c++ memory memory-management new-operator

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

在同一语句中编写引用声明和赋值

在一个声明中编写引用声明和赋值是否有任何问题.我已经尝试使用gcc,它似乎工作.

int x = 10;
cout << "x = " << x << "\n";

int &y = x = 11;
cout << "x = " << x << "\n";
cout << "y = " << y << "\n";
Run Code Online (Sandbox Code Playgroud)

给了我预期的输出

x = 10
x = 11
y = 11
Run Code Online (Sandbox Code Playgroud)

这是否适用于大多数编译器或是否存在可移植性问题?

c++ g++

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

std :: deque内存使用

我已经实现了一个简单的统计引擎,使用deque返回滚动均值和方差,以提供数据队列.

deque由许多条目构成,这些条目等于滚动值的数量.

当新值到达时,最前面的值会弹出前面,而新值会被推到后面.

我需要确保这不会在内存中增长,因为它预计会在很长一段时间内作为后台任务运行.

deque是否在使用中的堆上分配?有没有可用于修复尺寸的标志?

我在RHEL 5.3上使用G ++ 4.1.2

c++ memory stl deque

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

回调到单例类

我正在使用一个单例类,其中一个线程调用单例.在审查期间我被问到为什么我使用this指针而不是单例实例.

我的代码与建议的更改.

class myClass : public threadWrapper
{
public:
    static myClass& instance()
    {
        static myClass instance;
        return instance;
    }

    // This is the callback that I have implemented
    static void callback(void *me)
    {
        if (me != NULL)
            static_cast<myClass*>(me)->doCallback();
    }

    // This is the suggested callback
    static void callback2(void *me)
    {
        instance().doCallback();
    }

    // caller gets instance and then calls initialise()
    int initialise()
    {  
        if (initialised)
            return ERROR_ALREADY_INITIALISED;

        // Initialise the class

        // my thread startup call
        // thread wrapper class …
Run Code Online (Sandbox Code Playgroud)

c++ singleton multithreading

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