上一篇文章中虽然暂时性解决了问题,但是由于缓冲区大小固定,很可能发生溢出。当然可以根据结果字符串的长度动态分配内存,但还是不够优雅。asString()方法是一个常量函数,所以不能修改成员变量,但是构造函数没有这个限制,于是修改后的结果如下:
运行结果也正确,看来和我猜测的结果完全吻合。
#ifdef CXXTEST_RUNNING
#include < cxxtest / ValueTraits.h >
#include < typeinfo >
#include < sstream >
#include < string >
namespace CxxTest
{
template<class T>
class ValueTraits< TMyClass<T> >
{
private:
std::ostringstream _s;
std::string buf;
public:
ValueTraits( const TMyClass<T> &t )
{
_s << typeid(t).name() << "(" << t.value() << ")";
buf = _s.str();
}
const char *asString() const
{
return buf.c_str();
}
};
} ;
#endif // CXXTEST_RUNNING
#include < cxxtest / ValueTraits.h >
#include < typeinfo >
#include < sstream >
#include < string >
namespace CxxTest
{
template<class T>
class ValueTraits< TMyClass<T> >
{
private:
std::ostringstream _s;
std::string buf;
public:
ValueTraits( const TMyClass<T> &t )
{
_s << typeid(t).name() << "(" << t.value() << ")";
buf = _s.str();
}
const char *asString() const
{
return buf.c_str();
}
};
} ;
#endif // CXXTEST_RUNNING