Шаблон в C ++ с необработанным типом

0

В Java мы можем сделать что-то вроде этого:

ArrayList arrayList = new ArrayList<String>(); 
// Notice that String is not mentioned in the first declaration of array

КАК ОПАСНО

ArrayList<String> arrayList = new ArrayList<String>(); 

Как мы можем что-то подобное в C++?

  • 1
    std::vector<std::string> array;
  • 0
    Во многом таким же образом. Что вы пробовали?
Показать ещё 5 комментариев
Теги:
templates

2 ответа

4
Лучший ответ

Не так, как вы писали.

Что вы можете сделать, это одно из следующего, в зависимости от того, что вы на самом деле пытаетесь выполнить:

  • В С++ 11 вы можете использовать auto для автоматической адаптации к типу: auto = new ArrayList<String>(); , Это не дает вам полиморфизма, но это избавляет вас от ввода имени с левой стороны.
  • Если вам нужен полиморфизм, вы можете добавить уровень в свою иерархию классов и сделать левую сторону родительским классом.

Вот пример второго подхода:

class IArrayList   // define a pure virtual ArrayList interface
{
     // put your interface pure virtual method declarations here
};

template <typename T>
class ArrayList : public IArrayList
{
     // put your concrete implementation here
};

Тогда вы можете сказать в своем коде:

IArrayList* arrayList1 = new ArrayList<string>();
IArrayList* arrayList2 = new ArrayList<double>();

...и так далее.

  • 0
    Это звучит хорошо
  • 0
    Плохой совет Вы не можете предоставить рабочее определение IArrayList . По необходимости либо пустой интерфейс, либо интерфейс, который перемещает проверку типов во время выполнения, т. Е. Противоположно тому, что требуется от шаблона класса.
Показать ещё 6 комментариев
2

В c++, вы не можете использовать vector array = new vector<string>(), но в c++ 11, вы можете использовать auto ключевое слово: auto p = new vector<string>(), это так же, как vector<string> *p = new vector<string>() Надеюсь, что мой ответ может вам помочь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню