处理 std::variant 中的循环依赖
Dealing with circular dependency in 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
};
通常我会在“using Types...”之前前向声明 SomeClass,但是当涉及到 std::variant 时就不能这样做了。我也没有真正找到一种方法来转发声明“using”指令。
我发现的一种方法是前向声明 SomeClass 并在类型中使用指向它的指针,但我不喜欢这个想法(SomeClass 是一个生命周期很短的轻型对象,我想将其保留在外面堆)。
在 C++ 中是否有任何其他方法(除了指针)可以解决这个问题?我 运行 没主意了。
谢谢:)
编辑:
仅当我在真正定义 SomeClass 之前尝试使用 Types 时才会出现此问题,请参阅 https://godbolt.org/z/4jzhEd
在live example you provided中,你需要解决的问题是在SomeClass
之后定义SomeStruct
。
这样,当 SomeStruct
被定义时,您的 Types
变体将不再有任何不完整的类型。换句话说,这是顺序:
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;
// ...
};
我正在尝试处理以下场景中的循环依赖:
我有一个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
};
通常我会在“using Types...”之前前向声明 SomeClass,但是当涉及到 std::variant 时就不能这样做了。我也没有真正找到一种方法来转发声明“using”指令。
我发现的一种方法是前向声明 SomeClass 并在类型中使用指向它的指针,但我不喜欢这个想法(SomeClass 是一个生命周期很短的轻型对象,我想将其保留在外面堆)。
在 C++ 中是否有任何其他方法(除了指针)可以解决这个问题?我 运行 没主意了。
谢谢:)
编辑:
仅当我在真正定义 SomeClass 之前尝试使用 Types 时才会出现此问题,请参阅 https://godbolt.org/z/4jzhEd
在live example you provided中,你需要解决的问题是在SomeClass
之后定义SomeStruct
。
这样,当 SomeStruct
被定义时,您的 Types
变体将不再有任何不完整的类型。换句话说,这是顺序:
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;
// ...
};