首页 > 解决方案 > std::function 和 std::variant 相互引用

问题描述

我想创建以下类型

using Function = std::function<Variant(int)>;
using Variant = std::variant<int, bool, Function>;

在 Variant 中,我也需要具有 Function,但 Function 应该返回一个 Variant(按值)。但是我找不到正确的语法。我试图前向声明函数,但我不知道该怎么做。

据我所知,我应该能够写出这样的东西,因为对于函数的返回类型,前向声明通常就足够了。

标签: c++c++17

解决方案


你可以搭架子,当然。你不能让两个标识符都是别名。不能前向声明别名。

像这样的东西:

struct Variant;
using Function = std::function<Variant(int)>;
struct Variant : std::variant<int, bool, Function> {
    using variant::variant;
};

应该主要按预期工作。返回类型最初是不完整的(只要没有执行要求它完整的操作,这应该没问题)。然后它通过使用别名来完成Function

需要注意的是,Variant它现在是它自己的独立类型。所以模板参数推导的某些方面可能会有所不同。但我怀疑它可能会兴起并打扰你。

如果需要,您还可以选择转换角色。请注意,标准库可能未指定为从其组件继承的类型可靠地运行。因此,可能需要对基类引用进行一些转换。以最适合您的方式进行布局。


推荐阅读