【问题标题】:Variant like in C++ for JuliaJulia 的 C++ 中的变体
【发布时间】:2022-01-04 20:25:18
【问题描述】:

如何在 Julia 中使用 variant(在 C++ 中)之类的东西?

在 C++ 中,我可以做这样的事情

variant<int, float> value;

如何在 Julia 中为函数的参数做同样的事情?

function func(??)
    # something
end

对不起,如果它没有表达我想要做什么。

【问题讨论】:

  • 您应该添加您希望能够对此类类型执行的操作。即,它应该是标记的还是未标记的联合体。

标签: julia variant


【解决方案1】:

您可以使用union types 来做同样的事情。

function func(x::Union{Int, AbstractFloat})
    x + 1
end

请注意,C++ std::variant 是一个标记的联合,所以你总是可以问它是“哪个”变体,而 Julia 联合是一个正确的集合联合。务实地说,这意味着在std::variant&lt;int, int&gt; 中,您可以区分“左整数”和“右整数”,但Union{Int, Int} 实际上只是Int。无法判断它来自哪个“方面”。要模拟精确的标记联合行为,您需要制作一些自定义结构来表示每种情况。

struct LeftInt
    value :: Int
end

struct RightInt
    value :: Int
end

function func(x::Union{LeftInt, RightInt})
    # ... Check whether x is a LeftInt or not ...
end

但是,在 Julia 中,你通常不需要这个,如果你这样做了,那么使用泛型函数来进行调度通常会更聪明。

【讨论】:

  • (不懂C++)variant&lt;int, int&gt;中的int的左右是怎么区分的?就像变量的值是 5 一样,任何类似 typeof 的函数都不能判断值的类型是 int,而不是哪个?
  • @BatWannaBe 通常,您会让自动类型转换为您处理一切。但是您可以通过the index function 判断正在使用哪个变体。 C++ 为std::variant 提供了构造函数,允许您指定要使用的变体,即std::variant(std::in_place_index&lt;0&gt;, 100)std::variant(std::in_place_index&lt;1&gt;, 100)。通常,您不需要任何这些,但这是 C++ 编译器会跟踪的区别。
  • Here 是我所说的可运行示例。两个std::variant&lt;int, int&gt;,我们可以区分哪个是“左”,哪个是“右”。
【解决方案2】:

在 Julia 中,你可以写

function func(value)
    # something
end

然后编译器会自动为你编译这个无类型函数的单独的特定类型的方法,只要你用另一种类型调用它。

在 Julia 中,与 C++ 不同,您通常根本不提供参数类型,而是让编译器为您找出类型。您提供的任何参数类型都只是断言,或者有助于分派到正确的方法,以防您想自己为不同类型提供不同的实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多