Ma situation:Comment ajouter utiliser un pointeur à la valeur de membre en tant que paramètre de modèle par type (pas de valeur)
je dois souvent d'avoir un vecteur de structures où un champ peut être considéré comme une clé ou carte d'identité , et plutôt que de le stocker de manière coûteuse dans une carte (l'utilisation de la mémoire est très importante dans cette application) Je veux le stocker dans un vecteur plat, mais présenter une interface de type carte pour trouver des éléments par clé.
Ma première solution à ce problème:
template <class T, class Key, class KeyFn>
class TKeyedVector : public std::vector<T>
{
public:
const_iterator find(const Key& key) const {return std::find_if(begin(), end(), [&](const T& entry) {return keyFn(entry)==key; }); }
KeyFn keyFn;
};
struct KeyedDataEntry
{
std::string key;
int value;
struct KeyExtractor {
const std::string& operator()(const KeyedDataEntry& e) const {return e.key; };
};
};
using KeyedDataArray = TKeyedVector<KeyedDataEntry, std::string, KeyedDataEntry::KeyExtractor>;
Maintenant tout cela fonctionne, mais je voudrais être en mesure d'éliminer la nécessité pour le type KeyExtractor
en utilisant le pointeur vers la variable élément noyé dans le type :
template <class T, class Key, Key T::* keyFn>
class TKeyedVector : public std::vector<T>
{
public:
const_iterator find(const Key& key) const {return std::find_if(begin(), end(), [&](const T& entry) {return keyFn(entry)==key; }); }
};
using KeyedDataArray = TKeyedVector<KeyedDataEntry, std::string, &KeyedDataEntry::key>;
Cependant, je n'arrive pas à faire fonctionner cela. J'ai regardé la mise en œuvre de std::mem_fn
pour des indices, mais je ne peux pas savoir comment le faire. L'erreur que je reçois est quelque chose comme:
warning C4353: nonstandard extension used: constant 0 as function expression. Use '__noop' function intrinsic instead
Des indices?
EDIT: Version échantillon à http://ideone.com/Qu6TEy
Merci - cela m'a amené à la solution dont j'avais besoin. La clé était la syntaxe pour la définition de l'extracteur dans le modèle et ensuite comment l'extracteur est déréférencé dans la fonction 'find()'. Dans le cas présent, l'immuabilité des clés n'est pas un problème car elle ne doit pas fonctionner totalement comme une carte - je veux juste pouvoir trouver des objets par un champ de type ID. –