【std::reference_wrapper简单实现】

int main( void ){
	using namespace my_ref_impl;
	int var { 5 };
	
	auto var_const_ref = cref< int >( var );
//	static_assert( std::is_const< decltype( var_const_ref.get() ) >::value, "var_const_ref has underlying const ref" );
	
	auto var_ref = ref< int >( var );
	
	std::cout << "var before:\t" << var << '\n';
	var_ref.get() = 3;
	std::cout << "var after:\t" << var << '\n';
	
	auto func = []{ puts("func called..."); };
	auto fcref = cref< decltype( func ) >( func );
	fcref();
	
	return 0;
}

ab2bd9ef8e854c34a3e7f7da110fed8d.png

fd82fd34905f4e90877cbcd0771ad3e7.png 

#include <memory>
#include <type_traits>
#include <utility>
#include <functional>
#include <iostream>
#include <span>

namespace my_ref_impl{
	template < typename _Tp >
	class reference_wrapper{
		_Tp *_M_data;
		constexpr static _Tp* _S_fun( _Tp& __r ) noexcept
		{ return std::addressof( __r ); }
		static void _S_fun( _Tp&& ) = delete;

		template < typename _Up, typename _Up2 = std::remove_cv< std::decay_t< _Up > >::type >
		using __not_same
			= typename std::enable_if< !std::is_same< reference_wrapper, _Up2 >::value >::type;
		public:
			typedef _Tp type;
		template < typename _Up,
				   typename = __not_same< _Up >,
				   typename = decltype( reference_wrapper::_S_fun( std::declval< _Up >() ) ) >
		constexpr
		reference_wrapper( _Up&& __uref )
		noexcept( noexcept( reference_wrapper::_S_fun( std::declval< _Up >() ) ) )
		: _M_data( reference_wrapper::_S_fun( std::forward< _Up >( __uref ) ) ) { }
		reference_wrapper( const reference_wrapper& ) = default;
		reference_wrapper& operator=( const reference_wrapper& ) = default;
		constexpr _Tp&
		get( void ) const noexcept
		{return *_M_data; }
		constexpr
		operator _Tp&( void ) const noexcept
		{ return this->get(); }
		template < typename..._Args >
		constexpr
		typename std::result_of< _Tp&( _Args&&... ) >::type
		operator()( _Args&&...__args ) const{
			if constexpr ( std::is_object< type >::value )
				static_assert( sizeof( type ), "type must be complete" );
			return std::invoke( get(), std::forward< _Args >( __args )... );
		}
	};
	template < typename _Tp >
	reference_wrapper( _Tp& )
		->reference_wrapper< _Tp >;

	template < typename _Tp >
	inline reference_wrapper< _Tp >
	ref( reference_wrapper< _Tp > __t )
	noexcept
	{ return __t; }

	template < typename _Tp >
	inline reference_wrapper< const _Tp >
	cref( reference_wrapper< _Tp > __t )
	noexcept
	{ return __t.get(); }
};

 

 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XNB's Not a Beginner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值