## Variant
### 头文件: `"boost/variant.hpp"`
通过单个头文件就包含了所有 Variant 库。
```
"boost/variant/variant_fwd.hpp"
```
包含了 `variant` 类模板的前向声明。
```
"boost/variant/variant.hpp"
```
包含了 `variant` 类模板的定义。
```
"boost/variant/apply_visitor.hpp"
```
包含了对 `variant` 应用访问者机制的功能。
```
"boost/variant/get.hpp"
```
包含了模板函数 `get`.
```
"boost/variant/bad_visit.hpp"
```
包含了异常类 `bad_visit` 的定义。
```
"boost/variant/static_visitor.hpp"
```
包含了 `visitor` 类模板的定义。
以下部分摘要包含了 `variant` 类模板中最重要的成员。其它功能,如访问者机制,类型安全的直接取回,还有更先进的特性,如通过类型列表创建类型组等等,在 "[Usage](../Text/content.html#ch07lev1sec4)" 节讨论。
```
namespace boost {
template <typename T1,typename T2=unspecified, ...,
typename TN=unspecified>
class variant {
public:
variant();
variant(const variant& other);
template <typename T> variant(const T& operand);
template <typename U1, typename U2, ..., typename UN>
variant(const variant<U1, U2, ..., UN>& operand);
~variant();
template <typename T> variant& operator=(const T& rhs);
int which() const;
bool empty() const;
const std::type_info& type() const;
bool operator==(const variant& rhs) const;
bool operator<(const variant& rhs) const;
};
}
```
### 成员函数
```
variant();
```
这个构造函数对 `variant` 的类型组中的第一个类型进行缺省构造。这意味着在声明 `variant` 类型时,第一个类型必须是可以被缺省构造的,或者 `variant` 类型本身不能被缺省构造。该构造函数传播任何从第一个类型的构造函数抛出的异常。
```
variant(const variant& other);
```
这个复制构造函数复制 `other` 的当前值,并传播任何从 `other` 的当前类型的复制构造函数抛出的异常。
```
template <typename T> variant(const T& operand);
```
这个构造函数从 `operand` 构造一个新的 `variant` 。operand 的类型 `T`, 必须可以转换为限定类型组中的某个类型。复制或转换 operand 时抛出的异常将被传播。
```
template <typename U1,typename U2,...,typename UN>
variant(const variant<U1,U2,...,UN>& operand);
```
这个构造函数允许从另一个 `variant` 类型进行构造,后者的类型组为 `U1`, `U2`…`UN`, 它们必须可以转换为 `T1`,`T2`…`TN` (被构造的 variant 的类型组)。复制或转换 operand 时抛出的异常将被传播。
```
~variant();
```
销毁 variant, 并调用当前值的析构函数。注意,对于指针类型,不调用析构函数(销毁指针是无操作的)。析构函数不抛出异常。
```
template <typename T> variant& operator=(const T& rhs);
```
这个操作符放弃当前值,并赋予值 `rhs`. 类型 `T` 必须可以转换为 `variant` 的限定类型组中的某个类型。如果 `T` 正好是 `variant` 当前值的类型,`rhs` 被复制赋值给当前值;从 `T` 的赋值操作符抛出的异常将被传播。如果 `variant` 当前值的类型不是 `T`, 则当前值被替换为从类型 `T` 的(复制)构造函数所创建的值。从构造函数抛出的异常将被传播。这个函数还可能抛出 `bad_alloc`.
```
int which() const;
```
返回一个从零起计的索引,表示当前值类型在限定类型组中的位置。这个函数不会抛出异常。
```
bool empty() const;
```
这个函数永远返回 `false`, 因为一个 `variant` 永远不会为空。这个函数的存在是为了允许泛型代码把 `variant` 和 `boost::any` 视为同一种类型来处理。这个函数不会抛出异常。
```
const std::type_info& type() const;
```
返回当前值的 `type_info` 。这个函数不会抛出异常。
```
bool operator==(const variant& rhs) const;
```
如果 `*this` and `rhs` 相等则返回 `true` ,即 `which()==rhs.which()` 且 `*this` 的当前值与 `rhs` 根据当前值的类型的相等操作是相等的。这要求限定类型组中的所有类型都必须是可以进行等同性比较的(EqualityComparable)。当前值的类型的 `operator==` 抛出的任何异常将被传播。
```
bool operator<(const variant& rhs) const;
```
小于比较返回 `which()<rhs.which()` 或者,如果该索引相等,则返回对 `*this` 的当前值与 `rhs` 调用 `operator<` 所返回的结果。当前值的类型的 `operator<` 抛出的任何异常将被传播。
- 序
- 前言
- Acknowledgments
- 关于作者
- 本书的组织结构
- Boost的介绍
- 字符串及文本处理
- 数 据结构, 容器, 迭代器, 和算法
- 函数对象及高级编程
- 泛 型编程与模板元编程
- 数学及数字处理
- 输入/输出
- 杂项
- Part I: 通用库
- Library 1. Smart_ptr
- Smart_ptr库如何改进你的程序?
- 何时我们需要智能指针?
- Smart_ptr如何适应标准库?
- scoped_ptr
- scoped_array
- shared_ptr
- shared_array
- intrusive_ptr
- weak_ptr
- Smart_ptr总结
- Library 2. Conversion
- Conversion 库如何改进你的程序?
- polymorphic_cast
- polymorphic_downcast
- numeric_cast
- lexical_cast
- Conversion 总结
- Library 3. Utility
- Utility 库如何改进你的程序?
- BOOST_STATIC_ASSERT
- checked_delete
- noncopyable
- addressof
- enable_if
- Utility 总结
- Library 4. Operators
- Operators库如何改进你的程序?
- Operators
- 用法
- Operators 总结
- Library 5. Regex
- Regex库如何改进你的程序?
- Regex 如何适用于标准库?
- Regex
- 用法
- Regex 总结
- Part II: 容器及数据结构
- Library 6. Any
- Any 库如何改进你的程序?
- Any 如何适用于标准库?
- Any
- 用法
- Any 总结
- Library 7. Variant
- Variant 库如何改进你的程序?
- Variant 如何适用于标准库?
- Variant
- 用法
- Variant 总结
- Library 8. Tuple
- Tuple 库如何改进你的程序?
- Tuple 库如何适用于标准库?
- Tuple
- 用法
- Tuple 总结
- Part III: 函数对象与高级编程
- Library 9. Bind
- Bind 库如何改进你的程序?
- Bind 如何适用于标准库?
- Bind
- 用法
- Bind 总结
- Library 10. Lambda
- Lambda 库如何改进你的程序?
- Lambda 如何适用于标准库?
- Lambda
- 用法
- Lambda 总结
- Library 11. Function
- Function 库如何改进你的程序?
- Function 如何适用于标准库?
- Function
- 用 法
- Function 总结
- Library 12. Signals
- Signals 库如何改进你的程序?
- Signals 如何适用于标准库?
- Signals
- 用法
- Signals 总结