#ifndef NULLABLE_H
#define NULLABLE_H
#include "odbclib.h"
namespace odbclib
{
template<typename T>
class Nullable
{
typedef T const& const_reference;
typedef T const* const_pointer;
public:
Nullable()
:m_value(T()),
m_isNull(true)
{
}
Nullable(T const& value)
:m_value(value)
{
}
bool isNull() const{return m_isNull;}
operator T()throw(runtime_error)
{
if(isNull())
throw runtime_error("null has no value");
return m_value;
}
operator T()const throw(runtime_error)
{
if(isNull())
throw runtime_error("null has no value");
return m_value;
}
Nullable& operator=(Nullable const& value)
{
if(value.isNull())
m_isNull = true;
return *this;
}
Nullable& operator=(T const& value)
{
m_value = value;
m_isNull = false;
return *this;
}
T const& value()const throw(runtime_error)
{
if(isNull())
throw runtime_error("null has no value");
return m_value;
}
T& value()throw(runtime_error)
{
if(isNull())
throw runtime_error("null has no value");
return m_value;
}
public:
static Nullable const& Null;
private:
T m_value;
bool m_isNull;
template<typename V>
friend ostream& operator<<(ostream&,Nullable<V> const&) throw(runtime_error);
template<typename V>
friend istream& operator>>(istream&,Nullable<V> &);
};
template<typename T>
Nullable<T> const& Nullable<T>::Null = Nullable<T>();
template<typename T>
ostream& operator<<(ostream& os,Nullable<T> const& value) throw(runtime_error)
{
if(value.m_isNull)
throw runtime_error("null has no value");
os << value.m_value;
return os;
}
template<typename T>
istream& operator>>(istream& is,Nullable<T> &value)
{
is >> value.m_value;
return is;
}
template<>
class Nullable<string>
{
public:
Nullable()
:m_value(string()),
m_isNull(true)
{
}
Nullable(string const& value)
:m_value(value),
m_isNull(false)
{
}
Nullable(char const* value)
:m_value(value),
m_isNull(false)
{
}
Nullable(Nullable const& other)
{
m_value = other.m_value;
m_isNull = other.m_isNull;
}
template<size_t N>
Nullable(char const (&a)[N])
:m_value(a),
m_isNull(false)
{
}
bool isNull() const{return m_isNull;}
operator string()throw(runtime_error)
{
if(isNull())
throw runtime_error("null has no value");
return m_value;
}
operator string()const throw(runtime_error)
{
if(isNull())
throw runtime_error("null has no value");
return m_value;
}
Nullable& operator=(char const* value)
{
m_value.assign(value);
m_isNull = false;
return *this;
}
string const& value()const throw(runtime_error)
{
if(isNull())
throw runtime_error("null has no value");
return m_value;
}
string& value()throw(runtime_error)
{
if(isNull())
throw runtime_error("null has no value");
return m_value;
}
public:
static Nullable const& Null;
private:
string m_value;
bool m_isNull;
template<typename V>
friend ostream& operator<<(ostream&,Nullable<V> const&) throw(runtime_error);
template<typename V>
friend istream& operator>>(istream&,Nullable<V> &);
};
}
#endif
#include "odbclib.h"
namespace odbclib
{
Nullable<string> const& Nullable<string>::Null = Nullable<string>();
}
分享到:
相关推荐
最近发现之前写的代码生成器(entity、dao、service、controller、vue) 有点bug,在Service层判断空的时候,少了一部分条件。所以补充上了,随后又同事问我在代码中发下了@Nullable注解不知道怎么用?脑子是个好...
[self.view createAlertViewTitleArray:arrayTitle textColor:color font:[UIFont systemFontOfSize:16] actionBlock:^(UIButton * _Nullable button, NSInteger didRow) { //获取点击事件 NSLog(@"%@,%ld",...
支持值类型Nullable导出,包括Nullable等 支持Lua中function转委托,可以区分需要不同委托的参数的重载函数 支持c# LuaFunction对象转委托,简化调用方式。 支持无GC的多参数调用形式 支持重载函数自动折叠, 如:...
C#中的可空类型允许值类型变量能表示一个附加的null值,这为...同时,它们也增加了代码的健壮性,因为开发者可以明确地处理值类型的null情况,而不是依赖于某种语言级别的默认行为,这有助于提前发现并处理潜在的bug。
在Flask-SQLAlchemy 2.3.2版本中,可能包含了一些新的特性和修复,例如性能优化、对新版本Flask和SQLAlchemy的兼容性改进,以及可能的bug修复。开发者可以查阅官方文档以获取更详细的更新日志和使用指南。 总的来说...
在自定义View时,我们可能会遇到一些Bug,例如在xml文件中设置的自定义圆的宽和高是它能活动的空间的大小,而不是圆控件的大小。如果我们定义了100dp的宽和高,那么拖动圆超过100dp这个距离时,圆就会消失。解决这个...
MockMvcResultMatchers.forwardedUrl argument is not declared as nullable [SPR-17623] #22155 Cannot convert from Collection to RegularEnumSet [SPR-17619] #22151 TomcatHttpHandlerAdapter is not aware of ...
此外,3.0版本还引入了扩展方法、自动实现的属性和匿名类型的一些增强,以及预处理器指令的改进,如`#region`和`#nullable`。 这些规范文档对于开发者来说是非常宝贵的资源,它们可以帮助你深入理解C#的每一个细节...
7.1.1作为7.1系列的早期版本,修复了一些bug并提供了更稳定的环境。 - 新特性包括:改进的类型声明,如`void`返回类型和`nullable`类型;新增`??`空合并运算符;以及对`finally`块的改进等。 3. **便携版优势** -...
5. **javax.annotation-api-1.3.2.jar**:这个库包含了Java标准注解(Annotations),如`@Nullable`、`@NonNull`等,它们用于在代码中提供元数据,帮助编译器和工具进行静态分析,提高代码质量和可靠性。1.3.2版本...
D&H2虽然运行良好且没有重大bug,但它不支持模块化的Android项目。因此,作为模块化要求的一部分(更清晰的设计、更快的构建时间和即时应用),对库进行了重大重新设计。模块化是导致两个主要问题的原因: 1. 不同...
12. **C#新特性**:随着版本的更新,C#引入了许多新特性,如async streams、nullable reference types、pattern matching等,这些都值得开发者关注和学习。 以上只是C#开发中的一部分关键知识点,实际上还有更多如...
值类型包括结构体(struct)、基本数值类型(如int、float、bool等)、枚举(enum)和可空类型(nullable)。它们直接存储其值,当进行赋值操作时,会复制整个数据。值类型隐式继承自`System.ValueType`,并默认提供...
When dumping a non-enumerable item to a grid, nullable bools no longer cause a formatting error. When displaying XML documentation summaries in autocompletion listings and tooltips, <para> tags are no...
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_2_TO_1) { if ...
NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSLog(@"%@", response); ...
此外,还需要确保所有页面能够正常跳转,没有明显的bug存在。 #### 八、总结与展望 通过本次实训,不仅深入学习了SSM框架的相关知识和技术,还掌握了从需求分析到系统实现的完整流程。未来将继续优化现有系统,...
- **Nullable与Non-Nullable类型**:Kotlin强制区分可空与非空类型,如`String?`表示可为空的字符串,`String`则不能为null。 - **智能转换**:非空类型可以隐式转换为可空类型,反之需要显式使用`!!`操作符。 - ...
理解这两者的区别对于编写高效、无bug的代码至关重要。 1. 通用类型系统(CTS) 通用类型系统是.NET Framework的核心组成部分,它定义了一套标准的数据类型,供所有.NET语言使用。CTS确保了跨语言的兼容性和类型安全...
在Kotlin中,变量可以声明为非空(nonnull)或可空(nullable),这有助于避免因意外的null值而导致的运行时错误。 3. **函数与变量声明**:Kotlin的函数和变量声明简洁明了,如`fun functionName(args) { ... }`...