C++-自制pair类,含get和make_pair函数

/*
Zarathos 2021.2.1 1:30 pair
算是第二版了。之前那版写的太烂,两年后重写了一下,不过这次耗时更少了【可能是熟练了233】
完成了pair类的基本操作(构造函数 赋值运算符重载等) 完成了配套的Get和make_pair函数,非成员函数。属于友元
明天写完剩下的运算符重载
*/
#ifndef MY_PAIR_H
#define MY_PAIR_H
#include <type_traits>
#include <algorithm>
template <typename Ty_1, typename Ty_2>
class pair
{
private:
    Ty_1 first;
    Ty_2 second;

public:
    pair(/* args */) = default;
    pair(Ty_1 fir, Ty_2 sec) : first(fir), second(sec) {}
    pair(pair &rhs) : first(rhs.first), second(rhs.second){};
    pair(pair &&rhs)
    {
        //对移动构造函数,特别判断是否存在指针...如果存在,置为nullptr
        if constexpr (std::is_pointer<decltype(rhs.first)>::value)
        {
            std::exchange(first, rhs.first, nullptr);
        }
        else
        {
            first = std::move(rhs.first); //std::move移动掉原数值
        }
        if constexpr (std::is_pointer<decltype(rhs.second)>::value)
        {
            std::exchange(second, rhs.second, nullptr);
        }
        else
        {
            second = std::move(rhs.second);
        }
    }
    template <size_t num, typename T, typename U>
    friend auto &get(pair<T, U> &rhs);
    template <typename T, typename U>
    friend constexpr T &get(pair<T, U> &rhs);
    template <typename T, typename U>
    friend constexpr T &get(pair<U, T> &rhs);
    pair<Ty_1, Ty_2> &operator=(pair<Ty_1, Ty_2> rhs)
    {
        this->first = rhs.first;
        this->second = rhs.second;
        return *this;
    }
    ~pair(){};
};
//对get进行特化 auto自动推导类型 if constexpr在编译时就完成分支判断,来避免类型重复推导
template <size_t num, typename T, typename U>
auto &get(pair<T, U> &rhs)
{
    if constexpr (num == 0)
    {
        return rhs.first;
    }
    else
    {
        return rhs.second;
    }
}
//交换模板位置来返回 判断get<type1>或get<type2>
template <typename T, typename U>
constexpr T &get(pair<T, U> &rhs)
{
    return rhs.first;
}
template <typename T, typename U>
constexpr T &get(pair<U, T> &rhs)
{
    return rhs.second;
}
template <typename Ty_1, typename Ty_2>
constexpr auto make_pair(Ty_1 &&val1, Ty_2 &&val2)
{
    return pair<Ty_1, Ty_2>{std::forward<Ty_1>(val1), std::forward<Ty_2>(val2)};
}
#endif

 

posted @ 2021-02-01 01:43  扎坦诺斯  阅读(153)  评论(0)    收藏  举报