我有一个对象数组
[<#a star=1 val=1>, <#a star=nil val=3> , <#a star=2 val=2>]
Run Code Online (Sandbox Code Playgroud)
我需要按时间排序数组,然后按val排序
[ <#a star=2 val=2>, <#a star=1 val=1>, <#a star=nil val=3> ]
Run Code Online (Sandbox Code Playgroud)
但是使用sort_by会抛出错误,因为时间是零.
我现在用一种丑陋的方式来排序,但我确信有一个很好的方法可以解决它
starred=[]
@answers.each {|a| (starred << a) if a.starred }
@answers=@answers-starred
starred=starred.sort_by {|a| a.starred }.reverse
@answers=starred+@answers
Run Code Online (Sandbox Code Playgroud) 当我使用Object类的泛型类型的任何集合时,我在那种情况下在该集合中存储不同的对象.
我可以说该集合包含异构对象吗?
在C中,可以将数据指针分配给void指针,然后将其转换回原始类型,该数据指针将被恢复.语言标准保证这种转换不会丢失信息.这通常意味着(不一定,但对大多数平台来说都是如此),void指针的大小与数据指针的大小相同.因此,可以指望这些事实使用void指针作为异构类型的一般指针,而void指针本身具有统一的大小和表示.例如,一个有一个void指针数组,其元素指向动态分配的不同类型的对象.构造这样的数组使某些事情变得方便.我的问题是:如何实现类似的东西,C++中的通用指针类型,它符合以下内容:(假设g_pointer是类名)
从任何指针类型构造,可以编写类似的代码
g_pointer g_ptr = g_pointer(new T())
Run Code Online (Sandbox Code Playgroud)恢复原始指针
T* ptr = g_ptr.recover(), or
auto* ptr = g_tr.recover()
Run Code Online (Sandbox Code Playgroud)更新:根据一些评论,上面的内容无法用C++完成,那就像是
recover<Type>(g_ptr)
Run Code Online (Sandbox Code Playgroud)
应该足够了,抛出异常Type不兼容.
g_pointer可以包含在std :: vector或plain数组中,这基本上就是指
sizeof(g_pointer) // a predetermined constant number,
Run Code Online (Sandbox Code Playgroud)
(更新:这总是如此,只要这样一个类可以正确实现,感谢指出.)
我刚刚发现了boost :: any,看看它的介绍看起来似乎可能是我想要的,尽管可能不是这样.所以任何熟悉boost :: any的人都欢迎发表评论.
更新:(回复一些评论)
更新:谢谢@Caleth,std :: any很棒.
我在一些地方看过这个'[]和':语法,最着名的是在HList或HVect等异构列表包中.
例如,异构向量HVect定义为
data HVect (ts :: [*]) where
HNil :: HVect '[]
(:&:) :: !t -> !(HVect ts) -> HVect (t ': ts)
Run Code Online (Sandbox Code Playgroud)
在GHCi中,通过扩展TemplateHaskell或者DataKinds,我得到了这个
> :t '[]
'[] :: template-haskell-2.13.0.0:Language.Haskell.TH.Syntax.Name
> :t '(:)
'(:) :: template-haskell-2.13.0.0:Language.Haskell.TH.Syntax.Name
Run Code Online (Sandbox Code Playgroud)
我的印象是这与依赖类型和种类等有关,而不是模板haskell.
搜索引擎,以及hoogle和hayoo用'[]或者':相当糟糕地处理查询,因此问题是:这些'[]和':事物的名称是什么?非常欢迎指向文档或教程的指针.