0

已经向我展示了如何std::map使用boost::any.

但是,我在设置这个答案中的值时遇到了麻烦。

当我使用

accounts["bank"]["cash"] = 100;

gcc给出这个错误

error: no match for ‘operator[]’ in ‘accounts.std::map<_Key, _Tp, _Compare, 
_Alloc>::operator[]<std::basic_string<char>, boost::any, 
std::less<std::basic_string<char> >, std::allocator<std::pair<const 
std::basic_string<char>, boost::any> > >((* & std::basic_string<char>(((const 
char*)"bank"), (*(const std::allocator<char>*)(& std::allocator<char>())))))["cash"]’

如何访问map创建的锯齿状多维boost::any?(如果有更好的技术可以做到这一点,请告诉我。我只关心有效且快速编写的方法。)

多维声明

std::map<std::string, boost::any> accounts;
accounts["bank"] = std::map<std::string, boost::any>();
accounts["bank"]["cash"] = 100;

json-精神

我放弃并尝试使用 json-spirit mObject,因为所有这些似乎都已经内置了。

有趣的是,使用完全相同的符号,我得到完全相同的错误。

4

2 回答 2

1
std::map<std::string, boost::any> accounts;
accounts["bank"] = std::map<std::string, boost::any>();
accounts["bank"]["cash"] = 100;

当然,这会导致编译时错误,您将其放入 boost::any std::map,但编译器对此一无所知。accounts["bank"] 有 "boost::any" 类型,而 boost::any 没有

int& operator[](const char *)

阅读 boost::any 的工作原理:http: //www.boost.org/doc/libs/1_54_0/doc/html/any/s02.html

修复很简单:

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

int main()
{
  std::map<std::string, boost::any> accounts;
  accounts["cash"] = 100;
  accounts["bank"] = std::map<std::string, boost::any>();
  boost::any_cast<std::map<std::string, boost::any> &>(accounts["bank"])["cash"] = 100;
}
于 2013-09-15T16:37:29.457 回答
0

你是如何定义你的账户地图的?正如鲍里斯所说,您需要将两张地图嵌套在一起才能做您想做的事情。

用 boost::any 替换类型字符串

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main()
{
    map<string, map<string, string>> accounts;

    accounts["bank"]["cash"] = "infinity";

    cout << accounts["bank"]["cash"];

    return 0;
}

这是如何运作的?

  • 映射是键值对。

accounts["bank"] 返回最外层映射的值,对应于

map<string, **map<string, string>**>

accounts["bank"]["cash"] 返回最内层映射的值,对应于

map<string, map<string, **string**>>

定义一维地图不允许你做你想做的事,但二维地图可以。

于 2013-09-15T05:00:32.363 回答