2017-02-19 14 views
2

По-видимому, можно иметь заказанные карты и наборы 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?

ответ

2

В конце концов я нашел в документации: http://www.boost.org/doc/libs/1_63_0/doc/html/variant/reference.html

Каждый тип указан в качестве аргумента шаблона для варианта должен как минимум выполнить вышеуказанные требования. Кроме того, некоторые особенности варианта доступны только, если ее ограниченные типы отвечают требованиям этих следующих дополнительных понятий:

...

LessThanComparable: вариант сам по себе LessThanComparable тогда и только тогда, когда каждый его ограниченных типов отвечает требованиям концепции.

так string, int и bool все LessThanComparable то в этом случае код является безопасным и правильным.