是否可以将boost.any用作std :: map中的键(或类似的东西)?

时间:2009-05-05 09:01:21

标签: c++ boost

std::map<any, string>无效,所以我想知道是否还有另一种方法 有任意键?

3 个答案:

答案 0 :(得分:5)

我认为问题不在于Boost::Any,而在于您没有指定自定义比较器。由于map是一个已排序的关联容器,因此您需要有一个比较器。

以下适用于我:根据您的目的定制:

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

using namespace std;    
struct cmp {
    bool operator()(const boost::any& l, const boost::any& r) {
        try
        {
            int left = boost::any_cast<int>(l);
            int right = boost::any_cast<int>(r);
            return left < right;
        }
        catch(const boost::bad_any_cast &)
        {
            return false;
        }

        return false;
    }
};
int main() {   
    map<boost::any, string, cmp> ma;
     boost::any to_append = 42;
     ma.insert(std::make_pair(to_append, "int"));
    if (ma.find(42) != ma.end()) {
        cout << "hurray!\n";
    }
    return 0;
}

答案 1 :(得分:1)

您可能希望查看boost::variant而不是boost::any,因此您可以确定所使用的所有类型都具有可比性。

使用访问者是为variant提供比较运算符的最佳方式。

答案 2 :(得分:-1)

使用if(any.type()== other.type())