Я использую 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;
}
Я добился желаемого поведения, но мне пришло в голову, что тамдолжно быть, причина, по которой стандарт не включал оператор индекса.Конечно, это не просто лень.
Есть ли какой-либо предопределенный недостаток или возможные будущие проблемы, которые можно увидеть при этом?