【C++11】Tuple元组的辅助操作类实现(2)

获取索引

上一章节讲解了如果打印整个tuple,这次根据一个值获取该值在tuple的下标。

代码如下:

namespace TupleOperation
{
    //根据元素值获取索引
    //如果2个类型可以互换则返回类型为bool类型
    template<typename T, typename U>
    typename std::enable_if<std::is_convertible<T, U>::value
        || std::is_convertible<U, T>::value, bool>::type
        compare(T t, U u)
    {
        return t == u;
    }

    //类型不一致肯定不会比较成功
    bool compare(...)
    {
        return false;
    }

    //根据值查找index 
    template<int I, typename T, typename ...Args>
    struct find_index
    {
        static int call(std::tuple<Args...> const &tp, T&& val)
        {
            //如果get<I - 1>(tp)和val相等 则返回 I - 1,否则继续比较
            return (compare(std::get<I - 1>(tp), val) ?
                I - 1 : find_index<I - 1, T, Args...>::call(
                    tp, std::forward<T>(val)
                ));
        }
    };

    template<typename T, typename ...Args>
    struct find_index<0, T, Args...>
    {
        static int call(std::tuple<Args...> const& tp, T&& val)
        {
            //如果get<0>(tp)和val相等,则返回0,否则返回-1
            return compare(std::get<0>(tp), val) ? 0 : -1;
        }
    };
}

//辅助函数
template<typename T, typename ...Args>
int find_index(std::tuple<Args...>const & tp, T &&val)
{
    return TupleOperation::find_index<sizeof...(Args), T, Args...>::call(
        tp, std::forward<T>(val)
    );
}


int main()
{
    std::tuple<int, double, string> tp = std::make_tuple(1, 2.3, "abc");
    cout << "find index:" << find_index(tp, 1) << endl;
    cout << "find index:" << find_index(tp, 2.3) << endl;
    cout << "find index:" << find_index(tp, "abc") << endl;
    cout << "find index:" << find_index(tp, 9.01) << endl;

    return 0;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/gx864102252/article/details/79719830