统一的类成员初始化语法与std::initializer_list<T>

//C++ 98/03类成员变量是数组时的初始化语法
class A
{
public:
	A()
	{
		arr[0] = 2;
		arr[1] = 0;
		arr[2] = 1;
		arr[3] = 9;
	}
public:
	int arr[4];
};

//在 C++11中可以使用大括号语法初始化数组类型的成员变量
class A
{
public:
	A() :arr{ 2,0,1,9 }
	{

	}
public:
	int arr[4];
};
//在C++98/03标准中,对类的成员必须使用static const修饰,
//而且类型必须是整型(包括bool、char、int、long等),这样才能使用这种初始化语法
class A
{
public:
	//T的类型必须是整形,切必须使用static const修饰
	static const T t = _abs64;
};

//在C++11标准中就没有这种限制了,
//我们可以使用花括号(即{})对任意类型的变量进行初始化,而且不用是static类型
class A
{
public:
	bool ma{ true };
	int mb{ 2019 };
	std::string mc{ "helloworld" };
};

综上所述,在C++11标准中,无论是局部变量还是类变量,使用花括号({})初始化的语法被统一起来,写法也变得简洁.

        那么这种语法是如何实现的呢?如何在自定义类中也支持这种花括号呢?这就需要用到C++11新引入的对象std::initializer_list<T>了。它是一个模板对象,接收一个自定义参数类型 T,T既可以是基础数据类型(如编译器内置的 bool、char、int等),也可以是自定义的复杂数据类型。为了使用 std::initializer_list<T>,需要包含头文件,下面是一个例子:

#include<iostream >
#include <initializer_list>
#include<vector>
class A {
public:
	A(std::initializer_list<int> integers)
	{
		m_vecIntegers.insert(m_vecIntegers.end(),integers.begin(), integers.end());
	}
	~A()
	{}
	void append(std::initializer_list<int> integers)
	{
		m_vecIntegers.insert(m_vecIntegers.end(), integers.begin(), integers.end());
	}
		
	void print()
	{
		size_t size = m_vecIntegers.size(); 
		for (size_t i = 0; i < size; ++i)
			std::cout << m_vecIntegers[i] << std::endl;
	}
		
private:
	std::vector<int> m_vecIntegers;
};
int main(){
	A a{1,2,3};
	a.print();
	std::cout << "After appending..." << std::endl;
	a.append({ 4,5,6 });
	a.print();
	return 0;
}

json::array数据解析实现

#include<iostream>
#include<string>
#include<initializer_list>
#include<vector>

enum class jsonType
{
	jsonTypeNull,
	jsonTypeInt,
	jsonTypeLong,
	jsonTypeDouble,
	jsonTypeBool,
	jsonTypeString,
	jsonTypeArray,
	jsonTypeObject
};

struct jsonNode
{
	jsonNode(const char* key, const char* value):m_type(jsonType::jsonTypeString),m_key(key),m_value(value)
	{
		std::cout << "jsonNode contructorl call." << std::endl;
	}

	jsonNode(const char* key, double value):m_type(jsonType::jsonTypeDouble),m_key(key),m_value(std::to_string(value))
	{
		std::cout << "jsonNode contructorl2 call." << std::endl;
	}
	jsonType m_type;
	std::string m_key;
	//始终使用string类型保存值,避免浮点类型因为精度问题而显示不同的结果
	std::string m_value;
};

class json
{
public:
	static json& array(std::initializer_list<jsonNode> nodes)
	{
		m_json.m_nodes.clear();
		m_json.m_nodes.insert(m_json.m_nodes.end(), nodes.begin(), nodes.end());

		std::cout << "json::array() called." << std::endl;
		return m_json;
	}
	json()
	{

	}
	~json()
	{

	}

	std::string toString()
	{
		size_t size = m_nodes.size();
		for (size_t i=0;i< size;i++)
		{
			switch (m_nodes[i].m_type)
			{
			case jsonType::jsonTypeDouble:
				break;
			default:
				break;
			}
		}
	}

private:
	std::vector<jsonNode> m_nodes;
	static json m_json;
};

int main()
{
	json array_not_object = json::array({ {"currency","USD"},{"value",42.99} });
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值