数据存储库基于std :: map和boost :: any:转换错误

时间:2010-08-11 08:37:11

标签: c++ boost stl

我正在尝试实现一个方便的数据存储库或 我的一个小程序的知识库。 我使用了一个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 []则可行。 你能告诉我出了什么问题吗?

1 个答案:

答案 0 :(得分:0)

哦,short_n_crisp_exclamatory_word,{!}

我完全忘记了迭代器指向std::pair! 对我感到羞耻!

很抱歉打扰。

getVal的正确最后一行是:

        return boost::any_cast<T>(iter->second);
    }
无论如何,谢谢。