小编Mik*_*Mik的帖子

有没有办法获得std:string的缓冲区

有没有办法获得"原始"缓冲区oa std :: string?
我在想类似的东西CString::GetBuffer().例如,使用CString我会这样做:

CString myPath;  
::GetCurrentDirectory(MAX_PATH+1, myPath.GetBuffer(MAX_PATH));  
myPath.ReleaseBuffer();  
Run Code Online (Sandbox Code Playgroud)

那么,std :: string有类似的东西吗?

c++ winapi stl stdstring

14
推荐指数
2
解决办法
2万
查看次数

GoogleTest Print没有被要求上课

我有一个相当奇怪的问题,告诉googletest以我想要的方式使用PrintTo打印某个类.
该类是一个非常简单的2D点,它位于命名空间中,PrintTo函数位于同一名称空间中.事实上,我有一个完美打印的派生类(3D点).

以下是测试和PrintTo函数的一些代码(命名空间名称编辑,但其他所有内容都是从实际代码中复制和粘贴的):

// PrintTo Functions
namespace MyNamespace
{
    void PrintTo(const MyNamespace::CPunto2D& pto, ::std::ostream* os)
    {
        *os << "(";
        *os << pto.X();
        *os << ",";
        *os << pto.Y();
        *os << ")";
    }

    void PrintTo(const MyNamespace::CPunto3D& pto, ::std::ostream* os)
    {
        *os << "(";
        *os << pto.X();
        *os << ",";
        *os << pto.Y();
        *os << ",";
        *os << pto.m_Z;
        *os << ")";
    }
}

// Tests
TEST(TestPrintTo, TestPunto2D)
{
    MyNamespace::CPunto2D p1(1,1);
    MyNamespace::CPunto2D pRef(5,6);

    ASSERT_THAT(p1, Eq(pRef));
}

TEST(TestPrintTo, TestPunto3D)
{
    MyNamespace::CPunto3D pCentro(1,1,1);
    MyNamespace::CPunto3D …
Run Code Online (Sandbox Code Playgroud)

c++ googletest one-definition-rule

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

如何将谓词作为函数参数传递

我有一个类CMyVector,它包含一个指向CMyClass对象的指针向量,我有几个"查找"函数,可以根据不同的标准查找元素.例如,我有:

CMyClass* CMyVector::FindByX(int X);
CMyClass* CMyVector::FindByString(const CString& str);
CMyClass* CMyVector::FindBySomeOtherClass(CSomeOtherClass* ptr);
// Other find functions...
Run Code Online (Sandbox Code Playgroud)

首先,它们被实现为循环,遍历向量,寻找匹配X,str,ptr或其他的元素.所以我创建了谓词,就像这样:

class IsSameX:public unary_function<CMyClass*, bool>
{
    int num;
public:
    IsSameX(int n):num(n){}
    bool operator()(CMyClass* obj) const 
    { 
        return (obj != NULL && (obj->X() == num)); 
    }
};
Run Code Online (Sandbox Code Playgroud)

并以一堆看起来像这样的函数结束:

CMyClass* CMyVector::FindByX( int x )
{
    CMyVector::iterator it = find_if(vec.begin(), vec.end(), IsSameX(x));
    if (it != vec.end())
    {
        return *it;
    }
    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

它们看起来都是一样的,除了被调用的谓词,所以我想到了简化更多,并创建了一个像这样的函数:

CMyClass* CMyVector::Find( ThisIsWhatIDontKnow Predicate)
{
    CMyVector::iterator it = find_if(vec.begin(), vec.end(), …
Run Code Online (Sandbox Code Playgroud)

c++ stl predicate vector std

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

如何测试多参数公式

我正在重构一些实现公式的代码,我想先测试,以提高我的测试技能,并保留代码.

这段特殊代码是一个公式,它接受3个参数并返回一个值.我甚至有一些数据表,其中包含不同输入的预期结果,因此从理论上讲,我可以进行多种类型的测试,只需更改输入参数并根据相应的预期值检查结果.

但我认为应该有更好的方法来实现它,并查看我发现的值参数化测试的文档.

因此,我现在知道如何自动为不同的输入创建测试.
但是,如何将相应的预期结果与我计算出的结果进行比较呢?

我唯一能想到的是静态查找表和文本夹具中的静态成员,它是查找表的索引,并在每次运行时递增.像这样的东西:

#include "gtest/gtest.h"

double MyFormula(double A, double B, double C)
{
    return A*B - C*C;   // Example. The real one is much more complex
}

class MyTest:public ::testing::TestWithParam<std::tr1::tuple<double, double, double>>
{
protected:

    MyTest(){ Index++; }
    virtual void SetUp()
    {
        m_C = std::tr1::get<0>(GetParam());
        m_A = std::tr1::get<1>(GetParam());
        m_B = std::tr1::get<2>(GetParam());
    }

    double m_A;
    double m_B;
    double m_C;

    static double ExpectedRes[];
    static int Index;

};

int MyTest::Index = -1;

double MyTest::ExpectedRes[] =
{
//               C = 1
// …
Run Code Online (Sandbox Code Playgroud)

testing unit-testing googletest

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

TortoiseHG中是否有hgFlow的官方扩展名

我正在使用Mercurial和TortoiseHG进行版本控制,但我最近安装了SourceTree来查看它.我已经知道Flow扩展,看起来很有趣.

所以我想知道是否有更多或更少官方的扩展来增加对TortoiseHG中hgflow的支持.我遇到过thgflow,但我不知道它是否有效,如果项目仍然有效,如果还有其他选择......

任何见解?

mercurial tortoisehg

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

累积容器中元素的成员函数的结果

我有一个类,有一个返回计数的函数,如下所示:

class CTestClass
{
public:
    // ...
    size_t GetCount()const;
    // ...
};
Run Code Online (Sandbox Code Playgroud)

在我的程序中的某个地方,我有一个该类对象的向量.我有一个函数来获取总计数(CTestClass :: GetCount()的结果总和),像普通循环一样实现:

size_t sum = 0;
for(vector<CTestClass>::const_iterator it = v.begin(); it != v.end(); ++it)
{
    sum += it->GetCount();
}
Run Code Online (Sandbox Code Playgroud)

我想重构它以使用标准库中的可用设施,我想到了accumulate.我已经能够通过使用一个函数对象(简单)来做到这一点,但我几乎可以肯定它可以在不声明另一个对象的情况下完成(我没有C++ 11或者提升,所以没有lambda,但是我有TR1).
在寻找答案时,我发现了这些资源,但他们没有解决问题:

  • 几乎是同一个问题,提供的答案是循环,累积和仿函数,累积和lambda,但是有一个未解决的绑定引用等.
  • 这回答类似的问题使用accumulate,plusbind,但使用的是数据成员,而不是成员函数.

那么,有没有办法使用bind或类似的东西来做到这一点?

c++ stl std stl-algorithm

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

放置使用声明的位置

关于using声明的建议做法是什么(例如using std::vector;)?

它应该位于cpp / cc文件的顶部还是仅在使用范围内?

c++

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

std :: set在运行时选择更少或更大的比较器

我正在重构一些代码,发现有两个地方可以使用相同的代码编写,除了一组的比较器less<double>在一个地方而greater<double>在另一个地方.就像是:

double MyClass::Function1(double val)
{
    std::set<double, less<double> > s;
    // Do something with s
}

double MyClass::Function2(double val)
{
    std::set<double, greater<double> > s;
    // Do the same thing with s as in Function1
}
Run Code Online (Sandbox Code Playgroud)

所以我想到了:

double MyClass::GeneralFunction(double val, bool condition)
{  
    if(condition)  
    {  
        // Select greater as comparator  
    }  
    else
    {  
        // Select less as comparator  
    }  

    set<double, comparator> s;  
    // common code
}
Run Code Online (Sandbox Code Playgroud)

我通过使用我的自定义比较器函数使它工作,如下所示:

bool my_greater(double lhs, double rhs)
{
    return lhs > rhs;
} …
Run Code Online (Sandbox Code Playgroud)

c++ stl predicate set

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

如何使用满足某些条件的另一个向量的数据填充std :: vector

我有一个点矢量,我需要得到距离小于给定点的值的那些点.

我可以用一个简单的循环来做,但有更好的方法吗?

提前致谢

c++ stl vector

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

如何对通过引用传递的抽象类使用绑定

我正在尝试将 std::transform 与 std::bind 一起使用来简化循环。这是一些代码:

class ITest
{
public:
    virtual CPrueba Prueba(double p, double d = 0)const = 0;
};

void foo(const ITest& test)
{
    std::vector<double> v;
    std::vector<CPrueba> vRes;
    // ...
    // ...
    std::transform(v.begin(), v.end(), back_inserter(vRes), 
                   bind(&ITest::Prueba, test, _1, 0));
    //...
}
Run Code Online (Sandbox Code Playgroud)

这不编译。

我正在使用 VS2008 SP1 并且我收到了很多我不明白的模板错误,所以我在 ideone (gcc 4.7.2) 中进行了尝试。在那里,我遇到了一些更具可读性的错误,我得出结论,这与 ITest 是抽象的有关。

但是我已经尝试过改变我通过测试对象的方式,如果我通过指针来做,它就可以工作

那么有什么我可以用来保留函数签名并仍然使用带有绑定的转换而不是循环的东西吗?

c++ stl standard-library stdbind

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

如何在MFC中的工具栏中添加纯文本按钮


我需要在MFC的工具栏中显示一个纯文本按钮.我该怎么做?

我正在使用Visual Studio 2005,所以我没有使用MFC Feature Pack类.

谢谢

mfc toolbar

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

使用带有指向对象基类的函数在shared_ptr的向量上使用accumulate

我正在使用VS2008(所以我有TR1,但没有C++ 11),我不使用boost.以下描述是我真实问题的简化版本.

我有以下类层次结构:接口,实现它的抽象类和从该抽象类派生的几个类:

struct IMyInterface
{
    virtual void MinMax(int& Min, int& Max)const = 0;
};

class Base : public IMyInterface // Abstract
{
// ...
};

class A: public Base
{
public:
    virtual void MinMax(int& Min, int& Max)const { // Some stuff for A}
// ...
};

class B: public Base
{
public:
    virtual void MinMax(int& Min, int& Max)const { // Some stuff for B}
// ...
};
Run Code Online (Sandbox Code Playgroud)

然后我有一个到base类的shared_ptr向量:

// Somewhere in my code
typedef shared_ptr<Base> Base_sp;

vector<Base_sp> …
Run Code Online (Sandbox Code Playgroud)

c++ stl std

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