# 实验性库头文件 <experimental/ranges/utility>

< cpp‎ | header‎ | experimental

此头文件是范围库的一部分。

### 工具组件

定义于命名空间 `std::experimental::ranges`
swap | 交换两个对象的值 (定制点对象)
exchange | 以新值替换实参并返回其先前的值 (函数模板)

### 标签概念

定义于命名空间 `std::experimental::ranges`
TagSpecifier | 指定类型为标签说明符 (概念)
TaggedType | 指定类型表示一个标签说明符及其元素类型 (概念)

### 带标签对偶

定义于命名空间 `std::experimental::ranges`
tagged | 为元组式类型增加具名访问器 (类模板)
tagged_pair | 有标签 std::pair 的别名模版 (别名模板)
make_tagged_pair | 用于创建 `tagged_pair` 的便利函数 (函数模板)

### 概要

    namespace std { namespace experimental { namespace ranges { inline namespace v1 {

    namespace {
      constexpr /* 未指明 */ swap = /* 未指明 */;
    }

    template<MoveConstructible T, class U = T>
      requires Assignable<T&, U>
    constexpr T exchange(T& obj, U&& new_val) noexcept(/* 见定义 */);

    template <class T>
    concept bool TagSpecifier = /* 见定义 */;

    template <class F>
    concept bool TaggedType = /* 见定义 */;

    template <class Base, TagSpecifier... Tags>
      requires sizeof...(Tags) <= std::tuple_size<Base>::value
    struct tagged;

    template <TaggedType T1, TaggedType T2>
    using tagged_pair = /* 见定义 */;

    template <TagSpecifier Tag1, TagSpecifier Tag2, class T1, class T2>
    constexpr /* 见定义 */ make_tagged_pair(T1&& x, T2&& y);

    }}}}

    namespace std {

    template <class Base, class... Tags>
    struct tuple_size<experimental::ranges::tagged<Base, Tags...>>;

    template <size_t N, class Base, class... Tags>
    struct tuple_element<N, experimental::ranges::tagged<Base, Tags...>>;

    }