私の状況:
1 つのフィールドをキーまたは ID と見なすことができる構造のベクトルが必要になることがよくありますが、高価なマップに格納するのではなく (このアプリではメモリ使用量が非常に重要です)、フラットなベクトルに格納したいと考えています。キーで要素を見つけるためのマップのようなインターフェイスを提供します。
この問題に対する私の最初の解決策:
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>;
KeyExtractor
これですべて機能しますが、型に埋め込まれたメンバー変数へのポインターを使用して、型の必要性をなくしたいと考えています。
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>;
しかし、私はこれを機能させることができません。手がかりのための実装を見てきましたがstd::mem_fn
、それを行う方法がわかりません。私が得るエラーは次のようなものです:
warning C4353: nonstandard extension used: constant 0 as function expression. Use '__noop' function intrinsic instead
手がかりはありますか?