获取索引
上一章节讲解了如果打印整个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;
}