Список функциональности c ++

0

Я кратко рассмотрел различные c++ сайты и текстовые книги. Но ни у кого из них не было ничего, связанного с тем, что я искал.

То, что я хочу, это список в c++, который может содержать внутри него переменные int, string и int. Но прежде чем я часами играю с некоторым кодом, мне было интересно, знает ли кто-нибудь, существует ли такая вещь на самом деле? Я не прошу указать код для меня, если это возможно, я попробую его, а затем спрошу о любых проблемах, которые у меня есть.

благодаря

  • 0
    Вы знаете о стандартных контейнерах C ++ ?
  • 0
    Прочитайте это: stackoverflow.com/questions/3559412/…
Показать ещё 2 комментария
Теги:
string
arrays
list
int

4 ответа

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

Ваш лучший вариант: boost. Помните - я не сказал вам, что это будет легко.

Использование будет простым:

typedef boost::variant<...my necessary types...> MyVariant;

std::list<MyVariant> myList;
  • 0
    Это может быть нелегко, но это будет приятно.
  • 0
    Спасибо, попробую
Показать ещё 1 комментарий
2

Если вы имели в виду объект, который может содержать int, string и массивы в виде отдельных объектов, а не как один (например, объединение), я думаю, вы должны взглянуть на С++ 11 кортежей и использовать их в списке.

  • 1
    Список кортежей не является списком объектов разных типов ... std::tuple<int, std::string> например, содержит int и строку, а не int или строку.
  • 0
    В списке или вместо списка?
Показать ещё 3 комментария
0

Возможно, небезопасно размещать различные типы объектов/данных в одном списке.

Но если это требование, то почему бы не получить новый класс из std :: list с комбинацией отслеживания типов, которые вставляются в список, используя aproach, упомянутый в приведенном выше ответе.

  • 1
    Я не решаюсь понизить рейтинг новичка, поэтому, пожалуйста, удалите этот ответ и повторите за мной: не выводите из контейнеров STL! Не выводите из контейнеров STL! Не выводите из контейнера STL! , (Длинное) обоснование таково: 1. Вы должны отдавать предпочтение композиции, а не наследованию, когда это возможно, 2. Нет (функциональных) преимуществ в наследовании от класса без virtual методов, 3. Унаследование от класса без virtual деструктора и с открытым доступом. Копирование / перемещение конструкторов - это рецепт катастрофы (усечения).
0

Вы также можете создать структуру, используя указатель union или void.

enum varType
{
    vt_int,
    vt_float,
    vt_string
}

class myVariant
{
private:
    void* mVariable;
    varType mType;
};

или,

class myVariant2
{
private:
    union
    {
        float fValue;
        int iValue;
        std::string* sValue;        
    };
    varType mType;
}

Это нехорошо и требует кастинга, но если вам не нравится использовать другие библиотеки для такой небольшой задачи, это может помочь.

Edit1: вам понадобятся функции getStringValue, getFloatValue getIntValue.

Edit2: Вы можете безопасно использовать эти классы в std :: list.

Edit3: вам нужно вызвать деструктор std :: string (если переменная является строкой) самостоятельно.

  • 0
    объединения, содержащие не-pod члены, доступны только с c ++ 11.
  • 1
    @StoryTeller: и они нетривиальны (вам нужно вызвать деструктора самостоятельно)
Показать ещё 5 комментариев

Ещё вопросы

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