1. 解析
#include"json.hpp"
#include "fifo_map.hpp"
#include<string>
#include<iostream>
#include <fstream>
using namespace std;
using namespace nlohmann;
// A workaround to give to use fifo_map as map, we are just ignoring the 'less' compare
template<class K, class V, class dummy_compare, class A>
using my_workaround_fifo_map = fifo_map<K, V, fifo_map_compare<K>, A>;
using my_json = basic_json<my_workaround_fifo_map>;
这段代码是C++中的模板声明,用于创建一个特殊类型的映射(map)和一个JSON对象。下面是对代码的详细解释:
-
template<class K, class V, class dummy_compare, class A>
: 这是一个模板声明,它允许创建一个具有特定类型参数的泛型数据结构。class K
表示键(Key)的类型,class V
表示值(Value)的类型,class dummy_compare
是一个占位类型,用于在不需要比较函数时提供默认实现,而class A
表示分配器(Allocator)的类型,用于内存分配的管理。 -
using my_workaround_fifo_map = fifo_map<K, V, fifo_map_compare<K>, A>;
这里定义了一个类型别名my_workaround_fifo_map
,它是基于fifo_map
模板的特殊实例化。fifo_map
是一个数据结构,它按照先进先出(FIFO)的顺序管理键值对。K
和V
分别代表键和值的类型,fifo_map_compare<K>
是一个比较函数,用于确定键的顺序,这里它将键的比较操作委托给了K
类型的默认比较。A
是分配器类型,用于管理内存分配。 -
using my_json = basic_json<my_workaround_fifo_map>;
接下来,定义了另一个类型别名my_json
,它是basic_json
模板的特化。basic_json
是一个表示JSON对象的数据结构,它可以存储各种类型的数据,如字符串、数字、布尔值、数组和对象等。在这里,my_workaround_fifo_map
被用作basic_json
的参数,这意味着my_json
将能够存储键值对,其中键值对的顺序将按照FIFO原则进行管理。
总结来说,这段代码定义了两种特殊类型的数据结构:一个是根据FIFO原则管理键值对的映射(my_workaround_fifo_map
),另一个是使用这种映射作为内部存储结构的JSON对象(my_json
)。这样的设计可以用于需要按照元素插入顺序来处理JSON数据的场景。
2. using用法
在C++中,using
关键字有几种不同的用法,主要可以分为类型别名声明和命名空间声明。以下是using
的几种常见用法:
-
类型别名声明:
using
可以用来为类型创建一个新的名字,这在模板编程中尤其常见,可以简化复杂的模板类型名称。例如:using IntPtr = void*; // 给void*类型创建一个新的别名IntPtr using StringMap = std::map<std::string, int>; // 为特定模板实例创建别名
-
命名空间声明:
using
声明可以将命名空间中的特定成员引入当前作用域,这样就不需要在每次引用时都使用完整的命名空间限定符。例如:using std::cout; // 将std::cout引入当前作用域 using std::endl;
这样可以在后续代码中直接使用
cout
和endl
,而不需要再次写std::
前缀。 -
命名空间别名: 除了引入单个成员,
using
还可以为整个命名空间创建别名,这样可以在整个文件或代码块中简化命名空间的引用。例如:using namespace std; // 为std命名空间创建别名
使用这个声明后,可以在不使用
std::
前缀的情况下访问标准库中的任何成员。 -
声明别名模板: 在模板编程中,
using
还可以用来声明模板别名,这通常与模板参数一起使用。例如:template<typename T> using Container = std::vector<T>; // 声明一个模板别名Container
这样声明后,
Container<int>
就表示std::vector<int>
的别名。 -
别名模板: C++11引入了别名模板,它是一种特殊的模板,可以用来定义类型的别名。例如:
template<typename K, typename V> using MyMap = std::map<K, V>; // 定义一个别名模板MyMap
别名模板在使用时与普通模板别名相同,但它更明确地表达了这是一个模板。
using
关键字的这些用法提供了代码编写的灵活性和便利性,使得类型名称更加简洁,代码更易于阅读和维护。
3. 代码块
#include"json.hpp"
#include "fifo_map.hpp"
#include<string>
#include<iostream>
#include <fstream>
using namespace std;
using namespace nlohmann;
// A workaround to give to use fifo_map as map, we are just ignoring the 'less' compare
template<class K, class V, class dummy_compare, class A>
using my_workaround_fifo_map = fifo_map<K, V, fifo_map_compare<K>, A>;
using my_json = basic_json<my_workaround_fifo_map>;
int main()
{
my_json j;
j["f"] = 5;
j["a"] = 2;
my_json j2 = {
{ "pi", 3.141 },
{ "happy", true },
{ "name", "Niels" },
{ "nothing", nullptr },
{ "answer",{
{ "everything", 42 }
} },
{ "list",{ 1, 0, 2 } },
{ "object",{
{ "currency", "USD" },
{ "value", 42.99 }
} }
};
std::ofstream o("rd.json");
o << j.dump(4) << j2.dump(4) << std::endl;
std::cout << j.dump(4) << std::endl;
std::cout << j2.dump(4) << std::endl;
o.close();
system("pause");
return 0;
}