如何解决在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
};
通常,我会在“使用Types ...”之前转发声明SomeClass,但是当涉及std :: variant时,这是无法完成的。我还没有真正找到一种方法来向前声明“ using”指令。
我发现的一种方法是向前声明SomeClass并在Types中使用指向它的指针,但是我不喜欢这个想法(SomeClass是一个寿命很短的轻量级对象,我想将其保留在堆外)。
在C ++中还有其他方法(在指针旁边)来解决这一问题吗?我的想法不多了。
谢谢:)
编辑:
仅当我在真正定义SomeClass之前尝试使用Types时,该问题才会实际出现,请参阅https://godbolt.org/z/4jzhEd
解决方法
在live example you provided中,您需要解决的所有问题是在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;
// ...
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。