c++ - 处理 std::variant 中的循环依赖
问题描述
我正在尝试在以下情况下处理循环依赖:
我有一个 std::variant,说:
//types.h
using Types = std::variant<int, double, std::string, SomeClass>;
SomeClass 是一个非常简单的东西,它包含一些指针,带有一些模板逻辑:
#someclass.h
class SomeClass {
// few simple members (pointers and an integer)
void use(Types arg); // note usage of Types here
template<typename T, typename Ts...> // implicitly assuming T == Ts... == Types
void use(T arg, Ts... tail) {
use(arg);
use(tail...);
}
SomeClass(const SomeClass&) = default; // works fine
};
通常我会在“使用类型...”之前前向声明 SomeClass,但对于 std::variant 则无法做到。我也没有真正找到一种方法来前向声明“使用”指令。
我发现的一种方法是前向声明 SomeClass 并在 Types 中使用指向它的指针,但我不喜欢这个想法(SomeClass 是一个非常轻的对象,生命周期很短,我想让它远离堆)。
C++ 中有没有其他方法(除了指针)来解决这个问题?我的想法不多了。
谢谢 :)
编辑:
仅当我在真正定义 SomeClass 之前尝试使用 Types 时才会出现此问题,请参阅https://godbolt.org/z/4jzhEd
解决方案
在您提供的实时示例中,您需要解决的问题是SomeStruct
在之后定义SomeClass
。
这样,您的变体在定义Types
时将不再有任何不完整的类型。SomeStruct
换句话说,这里是顺序:
class SomeClass;
using Types = std::variant<..., SomeClass>;
class SomeClass {
// ... // Types used here, but doesn't need to have all complete types
};
struct SomeStruct {
Types value;
// ...
};
推荐阅读
- git - 如何将上游分支的更改合并到我的 fork 分支
- javascript - How to change the CSS of all the elements in the page - JavaScript
- aws-sdk - AWS API Gateway SDK“不是函数”错误
- xcode - Xcode 9.4.1 没有响应
- gnuplot - 如何在使用gnuplot限制y轴值的同时重新缩放x轴?
- python - 如何使它成为递归?
- javascript - 使用 node js 动态构建 JSON
- css - 识别匿名块框
- c - 谁能告诉我为什么我的数组无法使用该函数?
- asp.net - Sendgrid - 提供的授权授权无效、过期或撤销