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

Posted

技术标签:

【中文标题】是否可以使用 boost.any 作为 std::map 中的键(或类似的东西)?【英文标题】:Is it possible to use boost.any as a key in a std::map(or something similiar)? 【发布时间】:2009-05-05 09:01:20 【问题描述】:

std::map<any, string> 不工作所以我想知道是否有另一种方法 有任意键吗?

【问题讨论】:

如何在 *** 中发布模板参数? 【参考方案1】:

我认为问题不在于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;

【讨论】:

您的比较函子不适用于地图,因为对于某些 (a, b) 对的 a 举个例子就好了。无论如何,我确实认为可以在比较器失败的情况下构建更多此类情况。跨类型排序的想法对我来说并不好。 一个例子是任何一对,其中一个 (a) 包含和 int,另一个 (b) 包含一个字符串。对于 a 感谢您的示例。我确实有这个想法。关键是,您无法跨类型进行比较。所以,...【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于是否可以使用 boost.any 作为 std::map 中的键(或类似的东西)?的主要内容,如果未能解决你的问题,请参考以下文章

使用boost :: is_any_of的多个拆分令牌

如何将boost :: any打印到流中?

为啥 std::any 没有 unsafe_any_cast?

使用 boost::is_any_of 拆分会混淆分隔符 ",," 和 ","

调用模板函数出错

用于异构POD类型的C ++容器