boost :: variant的树状容器有任何缺点吗?

时间:2017-02-19 10:56:23

标签: c++ dictionary set boost-variant

显然可以使用有序的地图和boost::variant的集合,如下所示:

typedef boost::variant<std::string, int, bool> key_type;
std::map<key_type, size_t> m;

m.insert(std::make_pair(std::string("a"), 3));
m.insert(std::make_pair(1, 7));
auto x = m.find(1);
std::cout << x->first << " " << x->second << "\n";
x = m.find(std::string("a"));
std::cout << x->first << " " << x->second << "\n";

输出:

1 7
a 3

然而,我发现有些可疑;我查看了源代码,看看它是如何工作的,但没有得到很多...不知何故,不同的类型必须与operator<进行比较...这需要为任何2定义类型;除了将不同类型与<进行比较之外,对我来说本身毫无意义。因此,我想知道在性能方面是否存在使用地图或boost::variant集的问题。有捕获吗?或者是否可以拥有boost::variant的地图或集合?

1 个答案:

答案 0 :(得分:2)

我最终在文档中找到了它:http://www.boost.org/doc/libs/1_63_0/doc/html/variant/reference.html

  

指定为变体的模板参数的每个类型必须至少满足上述要求。此外,变体的某些特征仅在其有界类型满足以下附加概念的要求时才可用:

...

  

LessThanComparable:当且仅当每个有界类型满足概念的要求时,variant本身是LessThanComparable。

由于stringintbool都是LessThanComparable,因此在这种情况下,代码是安全无误的。