2011-10-20 5 views
5

Ho una domanda per quanto riguarda le opzioni peso mosca, data la definizione di seguito, sulla base di http://www.boost.org/doc/libs/1_40_0/libs/flyweight/test/test_basic.cppBoost.flyweight e Boost.MPL

typedef boost::flyweights::flyweight< 
    std::string, 
    boost::flyweights::tag<int>, 
    boost::flyweights::static_holder_class<boost::mpl::_1>,   
    boost::flyweights::hashed_factory_class< 
     boost::mpl::_1, 
     boost::mpl::_2, 
     boost::hash<boost::mpl::_2>, 
     std::equal_to<boost::mpl::_2>, 
     std::allocator<boost::mpl::_1> 
    >, 
    boost::flyweights::simple_locking, 
    boost::flyweights::refcounted 
> StringFlyweight; 

StringFlyweight test1("Hello World"); 

che valore ha boost::mpl::_1 e boost::mpl::_2? Quando sono assegnati?

boost::mpl::_1 è probabilmente std::string. boost::mpl::_2 dovrebbe essere size_t? Se vero, come viene detratto? Non capisco come viene scelto key_type.

Ho letto http://www.boost.org/doc/libs/1_41_0/libs/flyweight/doc/tutorial/lambda_expressions.html ma è il mio primo contatto con Boost.MPL e non è sufficiente :)

risposta

4

boost::mpl::_1 e boost::mpl::_2 sono segnaposto; possono essere usati come parametri del template per differenziare il binding da un argomento reale ad un momento successivo. Con questo, si può fare un'applicazione parziale (trasformando una metafunzione che ha una n-arità in una funzione avente una (nm) -arità), espressioni lambda (creando una metafunzione al volo dove è necessario), ecc.

Un'espressione che contiene almeno un segnaposto è un'espressione segnaposto, che può essere richiamata come qualsiasi altra metafunzione, con alcuni argomenti che sostituiranno i segnaposto.

Nel tuo esempio, supponendo che il seguente typedef

typedef boost::flyweights::hashed_factory_class< 
    boost::mpl::_1, 
    boost::mpl::_2, 
    boost::hash<boost::mpl::_2>, 
    std::equal_to<boost::mpl::_2>, 
    std::allocator<boost::mpl::_1> 
> hashed_factory; 

possiamo supporre che in qualche altro punto nel codice, il hashed_factory verrà richiamato con alcuni parametri:

typedef typename 
    boost::mpl::apply< 
     hashed_factory, 
     X, 
     Y 
    >::type result; // invoke hashed_factory with X and Y 
        // _1 is "replaced" by X, _2 by Y 

io no guarda nel codice Flyweight, ma possiamo supporre che _1 sarà associato al tipo di valore del peso mosca, e _2 al tipo di chiave (poiché è utilizzato per l'hashing e l'uguaglianza dei test). In questo caso, penso che entrambi saranno std::string poiché non viene specificato alcun tipo di chiave.

Non sono sicuro che la mia spiegazione sui segnaposto di MPL sia abbastanza chiara, non esitare a leggere lo excellent MPL tutorial che spiega metafunzioni molto bene, espressioni lambda e altre funzioni di metaprogrammazione del modello.

+0

quindi, key_type è determinato dal peso mosca. Ma come posso determinare il tipo e alla fine impostarne uno? È molto importante che la chiave sia un tipo integrale, non una stringa. – vlg789

+0

Se si desidera specificare la chiave utilizzata per recuperare gli oggetti, è necessario utilizzare 'key_value ' come argomento per 'flyweight '. Devi anche dire alla biblioteca come recuperare una chiave da un valore, usando un "key extractor", un functor che restituisce la chiave corrispondente al valore dato come argomento. Vedi un esempio il tutorial di Boost.Flyweight (http://www.boost.org/doc/libs/1_47_0/libs/flyweight/doc/tutorial/key_value.html). –

Problemi correlati