Есть 2 проблемы с вашим кодом. Во-первых, std::enable_if_t
будет либо недействительным, либо разрешит тип. Если вы не укажете, какой тип по умолчанию void. В ваших примерах вы не указываете тип.
Вторая проблема заключается в том, что функции-члены зависят от шаблона класса. Весь код внутри шаблона должен быть действительным при его создании. Когда вы создаете экземпляр collection
с контейнером cont
, неконстантная перегрузка не сможет определить тип возвращаемого значения. Но он все еще является частью шаблона класса, и если его часть потерпит неудачу, компилятор не проигнорирует эту часть, но даст ошибку компиляции.
Способ решить эту проблему - сделать1008 * методы шаблонных методов и перенос параметра шаблона из класса. Таким образом, метод end
не устанавливается до тех пор, пока не будет вызван, и если один из них завершится неудачно, он будет в порядке, пока работает другой.
template <typename ITEMS>
struct collection {
ITEMS& _items;
collection(ITEMS& items) : _items(items) {
}
auto find(int i) const {
return std::find(_items.begin(), _items.end(), i);
}
template <typename T = ITEMS>
typename std::enable_if_t<std::is_const<T>::value, T>::const_iterator
end() const {
return _items.end();
}
template <typename T = ITEMS>
typename std::enable_if_t<!std::is_const<T>::value, T>::iterator
end() const {
return _items.end();
}
};