gpt4 book ai didi

julia - Julia 中是否有类似 C++ 的 typedef 的概念

转载 作者:行者123 更新时间:2023-12-02 04:27:59 28 4
gpt4 key购买 nike

我正在尝试学习 Julia,并从重写我的一个 C++ 程序开始。

我在寻找在 Julia 中表示以下概念的好方法时遇到问题。

我有一些结构,它们都是某种集合。假设我有一个地址簿和一个相册。每个系列都有非常不同的元素。现在,在 C++ 中,如果我知道 PhotoAlbum 已传递到函数中,则创建 Photo 类型的变量非常容易。

我不太想出 Julia 中的等效方法。理想情况下,编译器应该确切地知道集合由哪种类型组成,以便它可以尽可能地优化。

这就是我在 C++ 中的做法

class AddressBook
{
public:
typedef PersonalDetail Element;
}


class PhotoAlbum
{
public:
typedef Photo Element;
}


template<typename Collection>
void printFirstElement<Collection>(const Collection& c)
{
const typename Collection::Element firstElement = //c.first();...
// do something with firstElement
}

最佳答案

如果我正确理解你的问题,我会说你不必考虑它,因为编译器会知道所需的类型。例如,在上面的代码中,当您调用 first(c) (这相当于 c.first())时,该变量的类型将在编译时间(您可以通过在函数上运行 @code_warntype 来确认这一点)。

如果您能提供一个完整的小型工作示例,我可以为您提供一个工作代码。

一个更高级的主题是将一些元数据附加到您的类型。有几种方法可以做到这一点。让我向您展示其中之一 - 通过参数抽象类型。

abstract type AbstractCollection{T} end
struct PersonalDetail end
struct AddressBook <: AbstractCollection{PersonalDetail} end
struct Photo end
struct PhotoAlbum <: AbstractCollection{Photo} end
getcollectiontype(::AbstractCollection{T}) where T = T

现在您可以编写类似的代码来提取元数据

julia> ab = AddressBook()
AddressBook()

julia> pa = PhotoAlbum()
PhotoAlbum()

julia> getcollectiontype(ab)
PersonalDetail

julia> getcollectiontype(pa)
Photo

当然,它是一个 MWE,我不确定您的代码中是否需要它(如果您展示一个小的完整工作代码,我们可以讨论最佳的实现策略)。

而且这样的东西可能根本不需要。例如,您有一个标准函数eltype,预期返回集合中元素的类型。对于此函数,您可以为特定类型添加方法来获取有关它们所持有的元素类型的信息。然后,您可以简单地在代码中运行 eltype(collection) ,并在编译时再次获得有关集合元素类型的信息。

另请注意,Julia 中的类型也是值,因此例如以下代码可以正常工作,并且编译器根据需要了解所有类型(函数 f 尝试将其第二个参数 y 转换为值) code> 使用类型构造函数将其第一个参数 x 的类型设置为):

julia> f(x,y) = typeof(x)(y)
f (generic function with 1 method)

julia> f(10, 2.0)
2

julia> f(10.0, 2)
2.0

julia> @code_warntype f(10.0, 2)
Body::Float64
1 ─ %1 = (Base.sitofp)(Float64, y)::Float64
└── return %1

上面的定义等价于下面的f(x::T,y) = T(y)

关于julia - Julia 中是否有类似 C++ 的 typedef 的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54697944/

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