gpt4 book ai didi

c++ - 处理 std::variant 中的循环依赖

转载 作者:行者123 更新时间:2023-12-01 14:29:04 25 4
gpt4 key购买 nike

我正在尝试处理以下场景中的循环依赖:

我有一个 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 时就不能这样做了。我也没有真正找到一种方法来转发声明“using”指令。

我发现的一种方法是前向声明 SomeClass 并在 Types 中使用指向它的指针,但我不喜欢这个想法(SomeClass 是一个生命周期很短的轻型对象,我想让它远离堆).

在 C++ 中是否有任何其他方法(除了指针)来解决这个问题?我的想法用完了。

谢谢:)

编辑:

只有当我在真正定义 SomeClass 之前尝试使用类型时,问题才会真正出现,请参阅 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;
// ...
};

See here for a live example.

关于c++ - 处理 std::variant 中的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63540596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com