Я работаю над тестовой реализацией простых контейнеров, которые должны иметь возможность принимать значения consts. Моя цель - понять, как шаблоны делают это и предоставляют понятный внешний интерфейс.
Поэтому моя задача - создать контейнер, который принимает значения const. (Ниже только один метод сокращен до минимального кода)
const std::string const_string1 = std::string("test");
MyVector<const std::string> myVector;
myVector.push_back(const_string1);
Решение, которое я нашел.
template<typename T>
class MyVector {
public:
MyVector();
void push_back(const T &value);
T &operator[](unsigned int index);
private:
typename std::remove_const<T>::type *ptr;
int elemSize;
};
// I removed everthing only most important i.e remove_const
template<typename T>
void MyVector<T>::push_back(const T &value) {
if (ptr == nullptr) {
ptr = new typename std::remove_const<T>::type[4];
}
ptr[elemSize] = value;
elemSize++;
}
Обратите внимание на использование remove_const.
Видите ли вы это действительное использование? Могу ли я выразить это по-другому? Есть ли другой рекомендуемый метод для этого и как Vector STL делает это для того же случая, который я описал? (Я знаю, что до стандарта 2011 года вы не могли передать строку const в Vector)
, если я не удаляю const из исходного типа, он потерпит неудачу во время компиляции, т.е. не будет работать, если я этого не сделаюлишить констант из оригинального типа и не сможет скопировать значение.
ptr[elemSize] = value;