AlienScar

2 解读argument_wrapper

  • rttr/detail/misc/argument_wrapper.h

argument_wrapper是将变量右值地址保存成void* m_data中,用于函数参数的传递,所以argument_wrapper是不控制变量的生存期,生存期由外部调用者控制。

1. argument_wrapper的构造

argument_wrapper() : m_data(nullptr) {}

template<typename T, typename Tp = typename std::enable_if<
  !std::is_same<T, argument_wrapper>::value, T>::type>
argument_wrapper(T&& data) : m_data(const_cast<void*>(
  reinterpret_cast<const void*>(std::addressof(data)))) {}
  • argument_wrapper有2个构造函数,第一个构造函数用于传递空参数。
  • 第二个构造函数就是将右值的指针保存起来,待invoke的时候在取出使用。它的第一个模板参数就是传进来的值的类型,第二个模板参的功能是防止传入的参数也是一个argument_wrapper类型,这个是不允许的。
  • 给m_data的赋值的过程实际上就是把传入的变量的地址转成void*赋给m_data,因为传入的对象是一个右值,因此它可能是const的也可能不是const,而reinterpret_cast不能把const转成非const,但是非const是可以const,所以 reinterpret_cast 将指针统一转成 const void* 再通过const_cast 转成 void* 赋值给m_data。
阅读更多 »2 解读argument_wrapper

1 初识rttr


1. 介绍

rttr全称 Run Time Type Reflection ,是c++的一个运行时反射库。rttr的代码可以说是一场个人show,功能强大,代码花哨,作者将C++11/14的特性使用的淋漓尽致。如果你是一个C++新兵,我不建议你直接研究下面的代码,会搞得你晕头转向,而且大多数人写代码的时候也不会这样去写。

目前最新的master版本作者还在不断的更新修改,因此这次源码解读就选用了0.96的稳定版。

阅读更多 »1 初识rttr

2 Blink程序分析与调试

视频教程:https://www.bilibili.com/video/BV1Ki4y1u7Aa/

Blink程序分析

Esp8266不像普通的C++程序,拥有一个main函数的入口,Esp8266的SDK提供了2个接口,void setup() 和 void loop()。setup函数在系统启动上电完成或者按下reset按钮后调用一次,类似于初始化。而loop函数在setup初始化完以后就会不停的被调用,不管你写了多长的代码,程序只要执行完以后又会重新执行loop,你可以把这个机制想象为外部包裹了一层代码。

int main(int argc, char* argv[]) {
    setup();
    for (;;) {
        loop();
    }
    return 0; 
}
阅读更多 »2 Blink程序分析与调试

1 Esp8266开发环境配置

视频教程:https://www.bilibili.com/video/BV1PD4y1o7rQ/

Esp8266是由上海乐鑫开发的一款物联网模块,具备80Mhz – 160Mhz的主频,80kb的内存,13个GPIO并且支持2.4G wifi。当然,光有芯片我们是不能做什么的,因此本系列教程基于NodeMCU开发板和Arduino IDE来开发一些简单有趣的小东西。

1. 选择开发板

本教程使用的是NodeMCU1.0的开发版,如下图,注意绿色框内的引脚,没有引脚的是NodeMCU0.9,会少几个GPIO。

从外观上看,下面两款开发板没有什么区别,用起来也没有什么不一样,就是红框中的usb转串口芯片不一样。现在大多数的系统已经对这两款芯片免驱了,不过如果你的系统正好没有驱动的话,可以根据这个串口芯片型号安装正确的驱动。

nodemcu1.0
阅读更多 »1 Esp8266开发环境配置