Boost Variant: Как я могу сделать посетителя, который возвращает тип, который был установлен?

Я пытаюсь написать общую карту, которая использует Boost: вариант в качестве значения.
Я застрял при попытке написать функцию get (std :: string key), которая будет возвращать соответствующий тип.

Вот что я придумала до сих пор:

 class GenericHashMap {
private:
std::map< std::string, boost::variant<int, bool, double, std::string> > genericMap;

public:
template<typename T>
bool getValue(const std::string & key, T & value) {
if ( _map.find(key) == _map.end() ) {
return false;
}
T * valuePtr = boost::get<T>(_map[key]);
if (valuePtr == NULL) {
return false;
}
value = *valuePtr;
return true;
}
}

Мне интересно, как я должен обращаться с итераторами? Стоит ли делать свои собственные вложенные итераторы или просто возвращать вложенные std :: map.

редактировать

Я добавил дизайн класса, который я надеялся достичь (то есть общий хэш-карту). Проблема, с которой я столкнулся, заключалась в том, что я хотел, чтобы пользователь мог запрашивать, хранится ли для определенного ключа определенный тип.

0

Решение

Если у вас есть такая проблема, это, вероятно, означает, что вы должны использовать посетителя вместо того, чтобы получить значение из вашего варианта. Обычно это путь boost::variant,

Если вы думаете об этом: вы не хотите использовать конкретный тип для определенного значения ключа. В противном случае это означает, что вы теряете всю силу boost::variant, А это значит, что у вас должны быть разные карты для каждого набора ключей (поскольку вы знаете их статически, вы не должны помещать все в одну карту).

boost::variant действительно здесь, чтобы помочь вам с динамическим распределением, а не статическим ветвлением.

Заметка: В вашем примере вы дважды ищете свой предмет, когда он найден, вы должны сохранить результат find вместо того, чтобы отказаться от него, спасая вас от второго поиска.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector