C++ 杂谈(3)

intrusive container

主要是为了性能,前面好像 boost 的 intrusive 容器看的不是太懂。 后面有空继续研究一下。

如何提供 swap

似乎在自己的 namespace 里面做不大对啊,难道不应该把它放在 std 里面么?这个问题见前文讨论。

constructor delegation

这个 feature 其实挺搞笑的,Java 里面有,但是是在 constructor 里面写 this,C++ 也有,但并不是在 constructor 函数里面写另一个 constructor,而是和初始化成员 or base 一样,在参数列表括号外。如果你写成了前者,并不会出错,但是意思完全不同。

一个容易犯错的 namespace 问题

如果返回的是另一个 namespace 里面的对象,诸如在 namespace b 里面返回 namespace a 的对象,那么一定要用 ::a 而不是仅仅 a,因为如果 namespace b 里面嵌套了一个 namespace a 就会去查询那个 namespace。

auto 并不意味 const 或者 reference

这个和 template 的参数是类似的,因此如果需要 reference 就得写 auto&,需要 const 就不能忘记,否则或者导致编译错误或者导致 copy。

避免全局变量

其实很奇怪的是我们组 code 大量的使用了 FLAG,而且都是直接把这种全局变量的逻辑嵌入到最底层的最需要 reuse 的部件上的,如果有人 argue FLAG 方便的话,我真的很无语,我们的大部分程序如果分层的话不超过 4,这么少的 layer,就算从上面传递下去又费了多少事情?更何况,你程序偷懒,结果所有的 unit test 都被这个全局变量污染,非常的不 reusable… 每次说这个事情还总有人不以为然,哎…

模板特化的限制

如果有一个模板类 A<T> 其中定义了一个模板方法 A<T>::foo<U> 而需要为某些 U 做特化的时候 T 必须是给定的,也就是说不能在 enclosing template 没有特化的情况下特化 nested template。这种时候解决方案是将内层的逻辑单独拿出来作为一个不是 nested 的情况下处理的 template 方法或者类,然后在原先 templated method 调用这一个。

比较有意思的是 nested template 的写法很怪,比如类 foo 是模板类,有个模板方法 bar,写的时候如果把定义写在类声明外面需要写成 template <class T> template <class U> foo<T>::bar<U>(…),两个 template 不知道为啥不能写一块。

成员函数如果是 template,特化必须写在类外部。

另一个限制是函数模板不能部分特化 =.= 最后只能写成 struct 里面的 static… 比如某个函数希望对 int、double 有特化,还对所有的 pointer 有特化…

友元是否可以是模板

答案是 yes,写法是 template <typename> friend class MyTemplate;

——————
And he put the handmaids and their children foremost, and Leah and her children after, and Rachel and Joseph hindermost

Advertisements
C++ 杂谈(3)

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s