хранилище данных на основе std :: map и boost :: any: ошибки преобразования - PullRequest
0 голосов
/ 11 августа 2010

Я пытаюсь создать удобный репозиторий данных или базу знаний для моей маленькой программы.Я использую std :: map of boost :: any для хранения различной информации.В целях отладки и обеспечения безопасности у меня есть дополнительный безопасный метод доступа '' getVal () '' для данных.

Фрагмент содержит более тысячи слов:

РЕДАКТИРОВАТЬ: <<< Старый фрагмент заменен полным воспроизведением ошибки >>>

#include <map>
#include <boost/any.hpp>
#include <boost/shared_ptr.hpp>
#include <string>
#include <iostream>

typedef std::map<int, boost::any> KnowledgeBase_base;
/**
 *  * KnowledgeBase is simply a storage for information,
 *   * accessible by key.
 *    */
class KnowledgeBase: public KnowledgeBase_base
{
    public:
        template<typename T>
            T getVal(const int idx)
            {
                KnowledgeBase_base::iterator iter = find(idx);
                if(end()==iter)
                {
                    std::cerr << "Knowledgebase: Key " << idx << " not found!";
                    return T();
                }
                return boost::any_cast<T>(*iter);
            }

        bool isAvailable(int idx)
        {
            return !(end()==find(idx));
        }

    private:
};

int main(int argc, char** argv)
{
    KnowledgeBase kb;
    int i = 100;
    kb[0] = i;
    kb[1] = &i;

    std::cout << boost::any_cast<int>(kb[0]) << std::endl; // works
    std::cout << *boost::any_cast<int*>(kb[1]) << std::endl; // works
    std::cout << kb.getVal<int>(0) << std::endl; // error
    std::cout << kb.getVal<int*>(1) << std::endl; // error
    std::cout << "done!" << std::endl;
        return 0;
}

Когда я сохраняю Something* в нем и пытаюсь
РЕДАКТИРОВАТЬ: как видно наобновленный пример кода выше, он не должен быть указателем! Что-то * = kb-> getVal, с которым он жалуется: boost :: exception_detail :: clone_impl> 'what (): boost :: bad_any_cast:не удалось конвертировать с помощью boost :: any_cast

Если я использую KnowledgeBase :: operator [], это работает.Можете ли вы сказать мне, что не так?

1 Ответ

0 голосов
/ 11 августа 2010

О, короткий_n_crisp_exclamatory_word, {!}

Я полностью забыл, что итератор указывает на std::pair! Позор мне!

Извините за беспокойство.

Правильная последняя строка getVal:

        return boost::any_cast<T>(iter->second);
    }

Спасибо, в любом случае.

...