您将如何优雅地(以现代 C++ 方式)编写一个返回向量元素索引的函数,并将该向量作为参数,并引用其元素之一?
异常处理将不胜感激。
#include <vector>
template <class T>
std::size_t GetIndexFromRef(std::vector<T> &vec, T &item)
{
...
};
Run Code Online (Sandbox Code Playgroud)
这可以解决问题:
\ntemplate <class T>\nstd::size_t GetIndexFromRef(std::vector<T> const &vec, T const &item)\n{\n T const *data = vec.data();\n\n if(std::less<T const *>{}(&item, data) || std::greater_equal<T const *>{}(&item, data + vec.size()))\n throw std::out_of_range{"The given object is not part of the vector."};\n \n return static_cast<std::size_t>(&item - vec.data());\n};\nRun Code Online (Sandbox Code Playgroud)\n我正在使用std::lessand std::greater_equal,因为([comparisons.general\xc2\xa72]):
\n\n对于模板
\nless、greater、less_\xc2\xadequal和greater_\xc2\xadequal,任何指针类型的特化都会产生与实现定义的严格指针全序 ([defns.order.ptr]) 一致的结果。
\n[注 1:如果a < b是明确定义的指针a且b类型为P,则(a < b) == less<P>()(a, b)、(a > b) == greater<P>()(a, b),依此类推。\n\xe2\x80\x94尾注]
否则,与不属于向量一部分的对象进行比较将是 UB。
\n