具有类型别名的循环依赖项

Circular dependency with type aliases

本文关键字:循环 依赖 别名 类型      更新时间:2023-10-16

我有以下代码,其中包含使用 C++using关键字创建的类型别名,但问题是object取决于value,而又取决于object。由于它是一个类型别名,因此(据我所知(无法对其进行前向声明。

#include <variant>
#include <cstdint>
#include <string>
#include <unordered_map>
using integer = int64_t;
using flt = double;
using string = std::string;
using object = std::unordered_map<std::string, value>;
using value = std::variant<integer, flt, string, object>;

有没有办法对类型别名进行前向声明,以便编译以下代码或任何其他方法来实现我正在尝试执行的操作?

由于它是一个类型别名,因此(据我所知(无法对其进行前向声明。

不,没有办法。没有什么比类型别名的前向声明更像了。

我认为你能得到的最接近的是:

struct object;
struct value;
struct object
{
std::unordered_map<std::string, value*> data;
};
struct value
{
std::variant<integer, flt, string, object> data;
};

struct object;
struct value;
struct value
{
std::variant<integer, flt, string, object*> data;
};
struct object
{
std::unordered_map<std::string, value> data;
};

或任何其他方法来实现我想要做的事情?

好吧,您可以使用std::any

using object = std::unordered_map<std::string, std::any>;
using value = std::variant<integer, flt, string, object>;

尽管这会使您的代码模式变得困难。