2013-12-03 3 views
0

Есть ли способ заменить schema.liczby и schema.studenci чем-то вроде schema.($variable)? Было бы неплохо избежать дублирования кода, делающего то же самое в этом случае только для разных структур.Замена имени элемента конструкции переменной

string getFieldType(string field_name, SCHEMA schema, string table) 
{ 
    if (table == "liczby") 
    { 
     for (int i = 0; i < schema.liczby.integers.size(); i++) 
     { 
      if (schema.liczby.integers[i] == field_name) 
      { 
       return "int"; 
      } 
     } 

     for (int i = 0; i < schema.liczby.strings.size(); i++) 
     { 
      if (schema.liczby.strings[i] == field_name) 
      { 
       return "string"; 
      } 
     } 

     for (int i = 0; i < schema.liczby.doubles.size(); i++) 
     { 
      if (schema.liczby.doubles[i] == field_name) 
      { 
       return "double"; 
      } 
     } 

     for (int i = 0; i < schema.liczby.booleans.size(); i++) 
     { 
      if (schema.liczby.booleans[i] == field_name) 
      { 
       return "double"; 
      } 
     } 
    } 
    else if (table == "studenci") 
    { 
     for (int i = 0; i < schema.studenci.integers.size(); i++) 
     { 
      if (schema.studenci.integers[i] == field_name) 
      { 
       return "int"; 
      } 
     } 

     for (int i = 0; i < schema.studenci.strings.size(); i++) 
     { 
      if (schema.studenci.strings[i] == field_name) 
      { 
       return "string"; 
      } 
     } 

     for (int i = 0; i < schema.studenci.doubles.size(); i++) 
     { 
      if (schema.studenci.doubles[i] == field_name) 
      { 
       return "double"; 
      } 
     } 

     for (int i = 0; i < schema.studenci.booleans.size(); i++) 
     { 
      if (schema.studenci.booleans[i] == field_name) 
      { 
       return "double"; 
      } 
     } 
    } 
} 
+0

Вы не можете делать то, что ищете, на языках (таких как C++), которые не обеспечивают отражение. – mah

+1

Возможно, есть способ сделать то, что вы хотите, но не так, как вы предлагаете. Не могли бы вы показать нам определение 'SCHEMA'? – Beta

+1

Это немного пахнет как [XY-проблема] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). C++ имеет множество функциональных возможностей по типу, но не через такое отражение. –

ответ

0

Нет проблем. Ваши LICZBY_SCHEMA, STUDENCI_SCHEMA, PRZEDMIOTY_SCHEMA и SALE_SCHEMA идентичны, поэтому мы их заменяем BASIC_SCHEMA. Затем код становится намного проще:

struct BASIC_SCHEMA 
{ 
    vector<string> columns; 
    vector<string> integers; 
    vector<string> strings; 
    vector<string> booleans; 
    vector<string> doubles; 
}; 

struct SCHEMA 
{ 
    BASIC_SCHEMA liczby; 
    BASIC_SCHEMA studenci; 
    BASIC_SCHEMA przedmioty; 
    BASIC_SCHEMA sale; 
}; 

string getFieldType(string field_name, SCHEMA schema, string table) 
{ 
    BASIC_SCHEMA subSchema; 

    if (table == "liczby") 
    subSchema = schema.liczby; 
    else if (table == "studenci") 
    subSchema = schema.studenci; 
    else 
    return(""); 

    for (unsigned int i = 0; i < subSchema.integers.size(); i++) 
    { 
     if (subSchema.integers[i] == field_name) 
     { 
      return "int"; 
     } 
    } 
    ... 
} 

Мы можем сделать его еще более кратким, например. find(...), но это еще одна история.

1

Мы можем реорганизовать ваш код много. Есть много способов обмануть этого кота. Я думаю, что std::map делает вещи довольно прямолинейными, но YMMV. Я думаю, вам следует изменить тип второй карты, поэтому вы можете сохранить значение типа + (boost:variant или полиморфная настройка, вероятно, будет работать хорошо.) Этот код является лишь отправной точкой.

#include <string> 
#include <map> 
#include <vector> 

typedef std::map<std::string, std::map<std::string, std::string>> SCHEMA; 

int main() { 
    SCHEMA schema; 

    // Schema table 
    schema["liczby"]["wartosc"] = "column"; 
    schema["liczby"]["wartość"] = "int"; 
    schema["studenci"]["indeks"] = "column"; 
    schema["studenci"]["imie"] = "column"; 
    schema["studenci"]["nazwisko"] = "column"; 
    schema["przedmioty"]["id"] = "column"; 
    schema["przedmioty"]["nazwa"] = "column"; 
    schema["przedmioty"]["semestr"] = "column"; 
    schema["sale"]["nazwa"] = "column"; 
    schema["sale"]["rozmiar"] = "column"; 
    schema["sale"]["projektor"] = "column"; 
    schema["sale"]["powierzchnia"] = "column"; 
} 

std::string getFieldType(std::string field_name, SCHEMA& schema, std::string table) { 
    return schema[table][field_name]; 
} 
Смежные вопросы