2016-02-23 5 views
8

इस कोडक्या किसी प्रकार का 'हैश मैप' बनाना संभव है '* const किसी भी प्रकार'?

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 _ को आकार देने के लिए आकार नहीं दिया जाना चाहिए? इस परीक्षण के लिए, मैं करने की कोशिश की:

use std::any::Any; 
use std::mem::size_of; 

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

कौन सा प्रत्याशित ही पैदा करता है:

size_of(*const Any) = 16 
+4

FWIW , त्रुटि किसी भी सूचक के लिए एक गुण के लिए होता है। – Shepmaster

+1

मुझे लगता है कि त्रुटि इस तथ्य से आती है कि 'const * const t' के लिए हैश है, लेकिन' टी' को निश्चित रूप से 'आकार' होने की आवश्यकता है, भले ही यह अनावश्यक है। –

उत्तर

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(); 
} 
संबंधित मुद्दे