有没有办法获得"原始"缓冲区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有类似的东西吗?
我有一个相当奇怪的问题,告诉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) 我有一个类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) 我正在重构一些实现公式的代码,我想先测试,以提高我的测试技能,并保留代码.
这段特殊代码是一个公式,它接受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) 我有一个类,有一个返回计数的函数,如下所示:
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).
在寻找答案时,我发现了这些资源,但他们没有解决问题:
accumulate,plus和
bind,但使用的是数据成员,而不是成员函数. 那么,有没有办法使用bind或类似的东西来做到这一点?
关于using声明的建议做法是什么(例如using std::vector;)?
它应该位于cpp / cc文件的顶部还是仅在使用范围内?
我正在重构一些代码,发现有两个地方可以使用相同的代码编写,除了一组的比较器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) 我有一个点矢量,我需要得到距离小于给定点的值的那些点.
我可以用一个简单的循环来做,但有更好的方法吗?
提前致谢
我正在尝试将 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 是抽象的有关。
但是我已经尝试过改变我通过测试对象的方式,如果我通过指针来做,它就可以工作。
那么有什么我可以用来保留函数签名并仍然使用带有绑定的转换而不是循环的东西吗?
我需要在MFC的工具栏中显示一个纯文本按钮.我该怎么做?
我正在使用Visual Studio 2005,所以我没有使用MFC Feature Pack类.
谢谢
我正在使用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)