- 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的取值
template<typename T>
T& get_value() const
{
using raw_type = typename std::remove_reference<T>::type;
return (*reinterpret_cast<raw_type*>(const_cast<void *>(m_data)));
}
argument_wrapper的取值就很简单了,通过调用get_value<T>()并指定转换类型,m_data会被转成对应类型的指针,然后对其解引用并返回该变量引用即可。