2009-09-02 3 views
0

J'essaie de créer un conteneur boost :: multi_index qui utilise les fonctions membres w/parameters comme des clés.boost :: index multi-index par appel de fonction avec paramètre (s)

class Data { 
public: 
    std::string get(const std::string & _attr) { return _internals_fetch_data(_attr); } 

/* 
    assume some implementation for storing data in some structure(s) 
*/ 
}; 

Supposons que j'ai une rectangulaire liste de ces éléments de données que je veux plusieurs indicies plus. rectangulaire signifie que tous les éléments de la liste ont les mêmes attributs via get()

Le boost :: déclaration multi_index est quelque chose comme

typedef multi_index_container< 
    Data, 
    indexed_by< 
    ordered_unique< 
    BOOST_MULTI_INDEX_CONST_MEM_FUN(Data,String,get) 
    > 
    > 
> my_container; 

Sauf que BOOST_MULTI_INDEX_CONST_MEM_FUNCT() ne possède pas ces caractéristiques. Les touches composites fonctionnent toujours avec les variables membres.

Comment puis-je contourner ce problème? Il ne semble pas que je peux donner ordered_unique <> un coup de pouce :: function1

EDIT:

Après réflexion, voici l'essentiel de ce que je suis en train de faire.

boost :: multi_index détermine ses fonctions d'indexation pendant la compilation. Comment contourner ces fonctionnalités et utiliser des index déterminés au moment de l'exécution?

Répondre

2

Que supposez-vous de passer en argument pour fonctionner? Qu'est-ce que const std::string & _attr?

Quoi qu'il en soit, BOOST_MULTI_INDEX_CONST_MEM_FUN est juste une macro pour const_mem_fun foncteur. Vous pourriez écrire votre propre foncteur const_mem_fun1. Mais je ne sais pas comment vous allez l'utiliser. L'implémentation de const_mem_fun reçoit un objet par référence (ou wrapper, par exemple shared_ptr) et appelle ensuite la fonction de membre sans arguments.

boost::multi_index::indexed_by attend le type, pas un objet, ainsi que ordered_unique s'attend à ce type. C'est pourquoi vous ne pouvez pas écrire const_mem_fun1<Data, std::string, &Data::get>("string"). Pourquoi ne pouvez-vous pas utiliser la fonction get sans paramètre et créer un champ de chaîne spécial dans Data struct?

struct Data { 
    std::string _attr; 
public: 
    std::string get() const { return _internals_fetch_data(_attr); } 
}; 
+0

C'est le problème. Ne semble pas que je peux utiliser un _const_mem_fun1_ ici. –

+0

Comment allez-vous passer argument? Quelque chose comme 'ordered_unique (" chaîne ")>'? –

+0

Peut-être ("chaîne") peut-être un struct/wrapper comme un autre paramètre. –

Questions connexes