Я пытаюсь создать удобный репозиторий данных или базу знаний для моей маленькой программы.Я использую 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 [], это работает.Можете ли вы сказать мне, что не так?