2016-02-23 4 views
8

このコード`* const Any`型のものでキーイングされた` HashMap`を作成することは可能ですか?

use std::any::Any; 
use std::collections::HashMap; 

fn main() { 
    let x: HashMap<*const Any, i32> = HashMap::new(); 
} 

は私に次のエラー与える:すべての

error: the trait `core::marker::Sized` is not implemented for the type `core::any::Any` [E0277] 

let x: HashMap<*const Any, i32> = HashMap::new(); 
            ^~~~~~~~~~~~ 

最初に、それはおよそcore::any::Anyを訴えている理由は、私はキーがタイプ*const core::any::Anyである場合には、理解していません。 *const _は、それが何を指しているかにかかわらずサイズを決めてはいけませんか?これをテストするには、私が試した:

size_of(*const Any) = 16 
+4

FWIW、予想通り、生成

use std::any::Any; use std::mem::size_of; fn main() { println!("size_of(*const Any) = {}", size_of::<*const Any>()); } 

を、エラーは、特性へのポインターで起こります。 – Shepmaster

+1

私はこのエラーは、 'impl ハッシュfor * const T 'があるという事実から来ていると思いますが、' T'は暗黙的に 'Sized'である必要があります。 –

答えて

1

それはきれいな解決策ではないのですが、ここで私が思い付いたものです::

use std::any::Any; 
use std::collections::HashMap; 
use std::hash::{Hasher, Hash}; 
use std::cmp; 

struct Wrapper { 
    v: *const Any, 
} 

impl Wrapper { 
    fn get_addr(&self) -> usize { 
     self.v as *const usize as usize 
    } 
} 

impl Hash for Wrapper { 
    fn hash<H: Hasher>(&self, state: &mut H) { 
     self.get_addr().hash(state) 
    } 
} 

impl cmp::PartialEq for Wrapper { 
    fn eq(&self, other: &Self) -> bool { 
     self.get_addr() == other.get_addr() 
    } 
} 

impl cmp::Eq for Wrapper {} 

fn main() { 
    let x: HashMap<Wrapper, i32> = HashMap::new(); 
} 
関連する問題