我std::set
用来存储一个类的唯一实例。std::set
没有重载的下标运算符,因此您不能这样做set[0]
。
我找到了一种方法:
auto myClass = *std::next(set.begin(), index);
但是,我发现一遍又一遍地复制该代码很单调。std::set
所以我决定只扩展( class sset
) 并重载其中的下标运算符会更方便。
template <class T>
class sset: public std::set<T>
{
public:
T operator[](const uint32_t i) const
{
if(i <= (this->size()-1))
return *std::next(this->begin(), i);
else
throw std::out_of_range("Index is out of range");
}
};
int main()
{
auto myClass = set[0]; //works and no exception thrown
return 0;
}
我实现了预期的行为,但我突然想到标准不包含下标运算符一定是有原因的。当然不只是懒惰。
这样做是否有任何预先知道的缺点或可能的未来问题?