日常小结-模板类型限制、getline使用
- * C++模板类型限制 *
- * getline的内存 *
- * 一个常见的错误classname *pa, pb *
C++模板类型限制
今天写一个模板想用下类型限制。后来才发现C++模板是没有类型限制的。有一种说法使用如下代码:
template<class T : B>
class C()
{}
我试了一下出现了错误。不知道是使用错误还是不能使用这种类型写法。这个需要查下书。
此外C++11后有一种类型限制方法是是boost类中有限制继承的类型创建模板。
但是大多数类型使用继承类来初始化或者用来做构造器这样如果类型错误的话没有办法通过编译。这也算是一种通用的解决方案。
http://stackoverflow.com/questions/3175219/restrict-c-template-parameter-to-subclass
getline内存显示
void str2vector(){
if (str.size() == 0)
return;
stringstream ss;
str.erase(0, 1);
str.erase(str.end() - 1, str.end());
str.append(",");
ss << str;
string tmp;
int tmpint;
getline(ss, tmp, ',');
while (tmp!=""){
tmp = trim(tmp);
if (tmp == "NULL"){
PTree.push_back(0);
getline(ss, tmp, ',');
}
else{
tmpint = stoi(tmp);
PTree.push_back(new T(tmpint));
getline(ss, tmp, ',');
}
}
}
以上代码,用于分离[123,34,6,23]类代码的中的数字。我本来是想做一个leetcode的测试类。
需要用到stringstream类,来导入string字符串
getline输入流的时候在vsdebug里面显示不正常。查看不到当前还有多少字符串。
a,b,c如这样的字符串输入到getline中间。第一次调用的时候stringbuffer里面的a,b,c都消失了。但是必须通过3次调用才能分别得到a,b,c这是很有意思的地方不知道gdb可不可以看出来。而且stringstream在导入str时显示也不正常,在stringstream末尾有乱码。但并不需要手动添加加'\n\。
一个常见的错误classname *pa, pb
很多人认为上调代码生成了两个指针。其实是一个指针一个类的对象。避免这种问题的方法可以使用typedef类型。
typedef用在c中的频率其实远高于C++
typedef类型通常来说有四种功能:
定义一种类型的别名,而不是简单的宏替换,可以用作同时声明指针型的多个对象就如上代码如果用typedef就是两个指针。
用在struct代码中。这样在定义struct的时候前面不用带struct。
用来定义与平台无关的类型
简化声明
typedef和#define不同。后者只是简单的文本替换。通常来说typedef更好,尤其是在有指针的情况下。另外需要注意的是define不需要加;有片博客详细的总结了一下如下:
http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.html