【发布时间】:2019-10-07 18:56:56
【问题描述】:
我尝试在我的程序中为动态变量定义一个变体类型,但我似乎无法让它存储一个将其作为类型返回的函数。
using Value = std::variant<Integer, Float, Function>;
using Function = std::function<Value()>;
这不会编译,因为 Function 需要在 Value 时定义,但 Function 也依赖于 Value。我尝试通过将Function 类型内联到变体模板列表中来解决此问题,但似乎using 语句无法引用自己或被前向声明。
到目前为止,我最好的解决方案是将Function 定义为一个结构,以便我可以转发声明它。这可行,但看起来很hacky,所以我想知道是否有更好的方法?
struct Function;
// define Value
struct Function : std::function<Value()> {};
为了澄清,std::function 被用作示例的一部分,因为我认为展示我正在尝试做的事情会更容易,而且我的 hacky 解决方案也需要它。如果可能的话,我更希望有一种方法也可以使用普通函数指针。
【问题讨论】:
-
一个简单的函数指针也可以,我只是使用
std::function,因为我认为它会使示例更简单,并且也适用于我的hacky解决方案 -
老实说,我认为使用函数指针会更容易。但是正如您提到的
using不能引用自己。所以它并没有真正的帮助。 -
请注意,将
std::variant与不完整类型一起使用是未定义行为。见std::variant and incomplete type: how does it work?。所以看起来你的解决方案是未定义的行为,即使在你尝试时它看起来有效,也可能实际上不起作用。 -
你能把函数签名改成指向 Value 的指针吗?
-
原计划是让函数返回一个
std::optional<Value>,但为了简单起见,我在这里省略了它,但我不能使用指针返回类型。此外,我无法在其内部或之前引用Value声明。