Julia 朱莉娅有没有像C++';s类型定义 我试图学习朱丽亚,并通过改写我的一个C++程序开始。

Julia 朱莉娅有没有像C++';s类型定义 我试图学习朱丽亚,并通过改写我的一个C++程序开始。,julia,typedef,equivalent,Julia,Typedef,Equivalent,我很难找到一个好的方法来表达Julia中的以下概念 我有一些结构,它们都是某种集合。假设我有一本通讯录和一本相册。每个集合都有非常不同的元素。现在,在C++中,如果知道相册被传递到函数中,就很容易创建一个类型的变量。 在朱莉娅身上,我想不出一种与之相当的方式。理想情况下,编译器应该确切地知道集合由哪种类型组成,以便尽可能地优化 这就是我在C语言中所做的++ 类地址簿 { 公众: 类型定义细节元素; } 班级相册 { 公众: typedef光电元件; } 模板 无效printFirstElemen

我很难找到一个好的方法来表达Julia中的以下概念

我有一些结构,它们都是某种集合。假设我有一本通讯录和一本相册。每个集合都有非常不同的元素。现在,在C++中,如果知道相册被传递到函数中,就很容易创建一个类型的变量。 在朱莉娅身上,我想不出一种与之相当的方式。理想情况下,编译器应该确切地知道集合由哪种类型组成,以便尽可能地优化

这就是我在C语言中所做的++

类地址簿
{
公众:
类型定义细节元素;
}
班级相册
{
公众:
typedef光电元件;
}
模板
无效printFirstElement(常量集合和c)
{
const typename集合::Element firstElement=/c.first();。。。
//用firstElement做点什么
}

如果我正确理解了您的问题,我会说您不必考虑它,因为编译器将知道所需的类型。例如,在上面的代码中,当您调用
first(c)
(这相当于
c.first()
)时,此变量的类型将在编译时已知(您可以通过在函数上运行
@code\u 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
当然,它是一个MWE,我不确定您的代码中是否需要它(如果您展示一个完整的小代码,我们可以讨论最佳的实现策略)

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

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


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

,因为Julia中的变量可以保存类型,所以您只需

struct PersonalDetail
end
struct Photo
end

struct AddressBook
    Element
    AddressBook(Element=PersonalDetail) = new(Element)
end

struct PhotoAlbum
    Element
    PhotoAlbum(Element=Photo) = new(Element)
end

PhotoAlbum()
也就是说,您可以编写函数而无需指定其类型

function printFirstElement(c)
    @show c[1]
end
printFirstElement([AddressBook()])
printFirstElement([PhotoAlbum()])
printFirstElement([rand([AddressBook() PhotoAlbum()])])
printFirstElement(1:5) # doesn't specify element type with `Element`, but we can still access its first element

我已经发布了我对你问题的初步回答。但是,如果您提供了一个更完整的设计问题示例,但可能会建议使用另一种模式。这不是有效的Julia代码,而且从语义上讲,由于结构中的字段没有具体类型,因此性能会很差。
struct PersonalDetail
end
struct Photo
end

struct AddressBook
    Element
    AddressBook(Element=PersonalDetail) = new(Element)
end

struct PhotoAlbum
    Element
    PhotoAlbum(Element=Photo) = new(Element)
end

PhotoAlbum()
function printFirstElement(c)
    @show c[1]
end
printFirstElement([AddressBook()])
printFirstElement([PhotoAlbum()])
printFirstElement([rand([AddressBook() PhotoAlbum()])])
printFirstElement(1:5) # doesn't specify element type with `Element`, but we can still access its first element