是否可以使用 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
,因此您可以确定您使用的所有类型都是可比较的。
使用访问者是为variant
s 提供比较运算符的最佳方式。
【讨论】:
【参考方案3】:使用 if(any.type() == other.type())
【讨论】:
以上是关于是否可以使用 boost.any 作为 std::map 中的键(或类似的东西)?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 std::any 没有 unsafe_any_cast?