Знать тип данных элементов списка - PullRequest
0 голосов
/ 19 августа 2010

У меня есть список из 5 элементов.Я получаю первый элемент этого списка.Как я могу знать, каков тип данных этого элемента char * или int *?

Спасибо

Ответы [ 3 ]

1 голос
/ 19 августа 2010

Вы не можете.

Либо используйте списки для конкретных типов (один список для ваших символов-указателей, один список для ваших целых) или используйте структуру или объединение для хранения обоих типов значений с полем, которое указывает тип, например:

#define TYPE_INT    1
#define TYPE_STRING 2

struct MyValue
{
int type;        // TYPE_INT or TYPE_STRING
union
   {
   char *str;
   int   i;
   } value;
};

И сохраните эту структуру в вашем списке.

Если C ++ является опцией, рассмотрите возможность использования std :: list для хранения данных, относящихся к типу, или, если это невозможно, определите класс, аналогичный приведенной выше структуре, в котором вы экранируете различные типы данных, например, не включая проверка ошибок по типу):

class MyValue
   {
   public:
      enum ValueType
         {
         TYPE_NONE;
         TYPE_INT,
         TYPE_STRING
         };
      MyValue() : m_type(TYPE_NONE) {}
      MyValue(char *s) : m_type(TYPE_STRING), m_value.str(s) {}
      MyValue(int i) : m_type(TYPE_INT), m_value.int(i) {}
      ValueType getType() const {return m_type;}
      const char *getString() const {return m_value.str;}
      int getInt() const {return m_value.int;}
   private:
      ValueType m_type;
      union InternalValue
         {
         char *str;
         int   i;
         };
      InternalValue m_value;
   };
1 голос
/ 19 августа 2010

В C нет (портативного) способа узнать, есть ли у вас пустота *.Поэтому вы должны следить за этим самостоятельно, когда сохраняете элементы в списке.Другая возможность состоит в том, чтобы использовать специфичные для типа списки вместо общего списка void *.

0 голосов
/ 19 августа 2010

Что вы подразумеваете под «списком» здесь?

Это:

   sometype* lst;

т.е. массив или:

node* lst;

Связанный список?

В первом случае sometype определяет тип элементов в массиве, если только это не какой-то void*, что означает, что компилятор не знает тип, но программист (надеюсь) знает,Во втором случае вы должны взглянуть на определение node, оно должно содержать данные с некоторой информацией о типизации (и применяется аргумент void*, приведенный выше).

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