我正在尝试实现一个方便的数据存储库或 我的一个小程序的知识库。 我使用了一个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-&gt; getVal它抱怨:
boost :: exception_detail :: clone_impl&gt;'
what():boost :: bad_any_cast:使用boost :: any_cast
如果我使用KnowledgeBase :: operator []则可行。 你能告诉我出了什么问题吗?
答案 0 :(得分:0)
哦,short_n_crisp_exclamatory_word,{!}
我完全忘记了迭代器指向std::pair
!
对我感到羞耻!
很抱歉打扰。
getVal的正确最后一行是:
return boost::any_cast<T>(iter->second);
}
无论如何,谢谢。