Optional类

#include <type_traits>
#include <iostream>
using namespace std;

template<typename T>
class Optional
{
	using data_t = typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type;
public:
	Optional(){}

	Optional(const T& v)
	{
		Create(v);
	}

	Optional(const Optional& other)
	{
		if (other.IsInit())
		{
			Assign(other);
		}
	}

	~Optional()
	{
		Destroy();
	}

	template<class... Args>
	void Emplace(Args&&... args)
	{
		Destroy();
		Create(std::forward<Args>(args)...);
	}

	bool IsInit() const
	{
		return m_hasInit;	
	}

	explicit operator bool() const
	{
		return IsInit();
	}

	T const& operator*() const
	{
		if (IsInit())
		{
			return *((T*)(&m_data));
		}

		throw std::logic_error("is not init");
	}

private:
	template<class... Args>
	void Create(Args&&... args)
	{
		new (&m_data) T(std::forward<Args>(args)...);
		m_hasInit = true;
	}

	void Destroy()
	{
		if (m_hasInit)
		{
			m_hasInit = false;
			((T*)(&m_data))->~T();
		}
	}

	void Assign(const Optional& other)
	{
		if (other.IsInit())
		{
			Copy(other.m_data);
			m_hasInit = true;
		}
		else
		{
			Destroy();
		}
	}

	void Copy(const data_t& val)
	{
		Destroy();
		new (&m_data) T(*(T*)(&val));
	}


private:
	bool	m_hasInit = false;
	data_t	m_data;
};

struct MyStruct 
{
	MyStruct(int a, int b)
	{
		m_a = a;
		m_b = b;
	}

	MyStruct()
	{
		m_a = m_b = 0;
	}

	int m_a;
	int m_b;
};

int main()
{
	Optional<string> a("ok");
	Optional<string> b("ok");
	Optional<string> c("aa");

	cout << *c << endl;

	Optional<MyStruct> op;
	MyStruct t;
	op.Emplace(1, 2);
	
	if (op)
		t = *op;

	cout << t.m_a << endl;

	return 0;
}

Optional是Java 8中引入的一个用于解决空指针异常问题的容器。它可以包含一个非空的值,也可以表示为空。Optional的设计目的是为了避免在代码中频繁使用null值,从而提高代码的可读性和健壮性。 使用Optional可以有效地处理可能为空的值,避免出现NullPointerException。它提供了一系列方法来判断Optional对象是否包含值,如果有值则可以通过get()方法获取该值,或者使用orElse()方法指定一个默认值。 下面是一个示例代码,演示了如何使用Optional: ```java Optional<String> optionalValue = Optional.of("Hello World"); if (optionalValue.isPresent()) { String value = optionalValue.get(); System.out.println(value); } else { System.out.println("Value is absent"); } String defaultValue = optionalValue.orElse("Default Value"); System.out.println(defaultValue); ``` 在上面的代码中,我们首先使用`Optional.of()`方法创建了一个包含非空值的Optional对象。然后通过`isPresent()`方法判断Optional对象是否包含值,如果有值则通过`get()`方法获取该值并输出。如果Optional对象为空,则输出"Value is absent"。 接下来使用`orElse()`方法指定了一个默认值,并输出该默认值。如果Optional对象包含值,则输出原始值;如果Optional对象为空,则输出指定的默认值。 使用Optional可以有效地避免空指针异常,并提高代码的可读性和健壮性。它在编写Java代码时是一个非常有用的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值