remove_const внутри класса шаблона для типа - PullRequest
0 голосов
/ 04 октября 2019

Я работаю над тестовой реализацией простых контейнеров, которые должны иметь возможность принимать значения 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;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...