CheckReturn(检查返回值)

Loki库提供了一种方法,要求函数返回后,使用者必须对其进行检查或则赋值。以必须判断指针为例进行说明。

自己写的代码简化了很多

CheckReturn.h

#pragma once
#include <assert.h>

template<class T>
struct TriggerAssert
{
 static void run(const T&)
 {
  assert( 0 );
 }
};

// 检查函数返回值是否被赋值了,如果没有被赋值,则认为是非法的。必须给返回值赋值,即必须有所有权,不能出现中间变量
template<typename T, template<typename T> class TAssert = TriggerAssert>
class CCheckReturn
{
public:
 /// Conversion constructor changes Value type to CheckReturn type.
 inline CCheckReturn( const T* value )
  : m_value( value ), m_checked( false )
 {

 }

 /// 转移所有权
 inline CCheckReturn( const CCheckReturn & that ) :
 m_value( that.m_value ), m_checked( false )
 { that.m_checked = true; }

 /// 必须转换成bool检查
 // 此处也可以将bool替换成T表示必须赋值
 inline operator bool ( void )
 {
  m_checked = true; // 被转换过了
  return NULL != m_value;
 }
 
 inline ~CCheckReturn( void )
 {
  // asset或则其它方式也可以
  if (!m_checked)
   TriggerAssert<const T*>::run(m_value);
 }
private:
 const T* m_value;
 mutable bool m_checked; //是否被check过了。如果调用过operator则会赋值为true
};


测试使用。

#include "StdAfx.h"
#include "TestCheckReturn.h"
#include "CheckReturn.h"

class CTestPtr
{

};

CCheckReturn<CTestPtr> GetPtr()
{
 return CCheckReturn<CTestPtr>(new CTestPtr);
}
 
void CTestCheckReturn::Test()
{
 CCheckReturn<CTestPtr> aa = GetPtr();

 //if (aa) // 如果没有这句话,退出时就会进入我们的断言了
 {

 }
 int ii = 10;
}


我们可以根据这个思想实现我们想要的其它检查


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值