Как я могу написать метод для определения типа typedef во время выполнения? - PullRequest
1 голос
/ 20 декабря 2010

У меня есть двоичное дерево поиска, которое я хочу реализовать с разными типами. Двоичное дерево поиска является шаблонным и определяется с помощью следующего оператора:

typedef desiredType TreeItemType; // desired type of tree items i.e. string, int, Person

Обычно я бы просто изменил требуемый тип на строку для дерева строк, но что, если я хочу также создать дерево из целых чисел? Я думаю, мне нужно создать метод для определения типа typdef во время выполнения, но я не знаю, с чего начать, потому что требуемый тип может быть множеством типов переменных объектов. Есть идеи?

1 Ответ

0 голосов
/ 30 мая 2012

Трудно сказать из одной строки, но похоже, что вы можете использовать команду препроцессора C как

#define saveDesiredType desiredType    // save previous setting
#define desiredType char*                 // change to type   

... <code>

#define  desiredType saveDesiredType  // restore previous setting

однако, я думаю, вы можете определить определенный typedef только один раз в модуле (объектный файл .o).

ЕДИНСТВЕННЫЙ способ, которым я знаю для создания работоспособных древовидных структур переменных типов в C, состоит в том, чтобы перейти к модели манипуляции со всеми указателями, или добавить тип в качестве дополнительного параметра к функциям дерева, и сделать ВСЕМ указатель для различных размеры типов.
Немного более объектно-ориентированный подход будет заключаться в инкапсуляции ваших данных в структуру tree_node с данными типа.

typedef enum D_Type { ANINT , AFLOAT, ADOUBLE, ACHAR, ASTRING, OTHER} DATATYPE; 



typedef struct t_node{
DATATYPE dtype;
union {   // union is ONE of the following types, and Only one.
       int i;    // size of the union is the size of the largest type. 
       float f;
       double d;
       char c;
       char* string;
      }   // this union is unnamed , but could have a name.
} Tree_Node;

typedef Tree_Node* TreeItem;  //pass by reference

В вашем коде вы должны включить node-> dtype и работать только с переменной этого типа.

void tree_add (Tree T, TreeItem item)
{
  int i;
  float f;
  double d;
  char c;
  char* s;

  switch (item->dtype){
    case ANINT:
      i = item->i;
      break;
    case AFLOAT:
      f = item->f;
      break;
    case ADFLOAT:
      d = item->d;
      break;
    ...
   }//switch
    ...<code>
}//tree_add

double Pi = 3.141592653589793238;
TreeItem ti = ( TreeItem ) malloc (sizeof(Tree_Node) ); // struct Must be allocated
ti->dtype = ADOUBLE;
ti->d = Pi; 
ti->s = Pi; /* OOPS! error. (might go through without being detected -- depending on compiler) */ 
tree_add( atree , ti);

ti->s = "Now is the time for all good programmers to come the aid of their computers."; 
 /* OOPS! error. undefined behavior what about the double d? 
 (this might go through without being detected -- depending on compiler ) 
  but ti->dtype was not changed either so code will break. */

(похоже на работу, не так ли?)

...