UVW源码漫谈(二)
前一篇发布出来之后,我看着阅读量还是挺多的,就是评论和给意见的一个都没有,或许各位看官就跟我一样,看帖子从不回复,只管看就行了。毕竟大家都有公务在身,没太多时间,可以理解。不过没关系,我是不是可以直接想象为我写的东西还挺不错的,KeKe~~。
这一篇介绍一下源代码 ./src/uvw/emitter.hpp 里的东东。由于代码量实在比较大,我就折叠起来了,不然各位看官手指头滚上滚下的,太累了。之后我就写到哪儿贴哪儿的代码,注个大概源代码的位置,有兴趣自己打开源代码对照看看,是不是看的就比较舒服点了。

一、语言层面的一些好玩的东东
1、(源文件大概 第161行 —— 第185行)
1 static std::size_t next_type() noexcept { 2 static std::size_t counter = 0; 3 return counter++; 4 } 5 6 template<typename> 7 static std::size_t event_type() noexcept { 8 static std::size_t value = next_type(); 9 return value; 10 } 11 12 template<typename E>13 Handler<E> & handler() noexcept { 14 std::size_t type = event_type<E>(); 15 16 if(!(type < handlers.size())) { 17 handlers.resize(type+1); 18 } 19 20 if(!handlers[type]) { 21 handlers[type] = std::make_unique<Handler<E>>(); 22 } 23 24 return static_cast<Handler<E>&>(*handlers[type]); 25 }
1.1、static
其实说到static,大家看到这里的人应该都不会陌生,比如static函数,static变量等等。也都知道他们的特性,我就不过多说了。
在这里,大家请看第1行——第10行,有一个是静态函数,第二个则是一个函数模板,函数体里分别声明定义了两个静态变量,我们讨论的就是函数模板里的静态变量。看下面的例子:
1 template<typename> 2 static std::size_t event_type() noexcept { 3 static std::size_t value = 0; 4 return value++; 5 } 6 7