Что мне не нравится в профсоюзах, так это то, что они неразборчивы; они не дают никакой информации о том, каков базовый тип в настоящее время, и очень легко нарушить безопасность типов, обращаясь к неправильной стороне объединения.
Boost :: variable решает многие из этих проблем. Как указывается в документации, union является «почти бесполезным в объектно-ориентированной среде», в то время как boost :: variable дает очень объектно-ориентированный подход к решению практических задач объединения. Его интерфейс спроектирован так, чтобы не разрешать доступ к варианту, если вы не используете правильный тип, а предоставленный ими пример шаблона «посетитель» дает ошибки времени компиляции, если объединение расширено, чтобы включить тип, который вы не ожидали.
Как будто это полезно; Я думаю так. Я использовал их просто для больших интерфейсов
class some_xml_class {
public:
void set_property(const string&, const string&);
void set_property(const string&, const vector<string>&);
void set_property(const string&, const set<string>&);
void set_property(const string&, int);
void set_super_property(const string&, const string&);
void set_super_property(const string&, const vector<string>&);
void set_super_property(const string&, const set<string>&);
void set_super_property(const string&, int);
стихи
class some_xml_class {
public:
typedef boost::variant<string, vector<string>, set<string>, int> property_type;
void set_property(const string&, const property_type&);
void set_super_property(const string&, const property_type&);
(здесь также могут быть полезны шаблоны, но допустим, что impl был достаточно длинным, я не хотел его вставлять)