Получение типа, соответствующего строкам типа int, float и т. Д. - PullRequest
0 голосов
/ 06 декабря 2018

Есть ли какой-либо способ (функция / структуры / шаблоны) и т. Д. В c ++, где, если мы предоставляем строки, такие как int, float и т. Д. В качестве входных данных, а затем он возвращает соответствующий тип.Чтобы разработать сценарий, предположим, из БД, я смог получить этот тип данных столбца, скажем, ITEM_NAME имеет тип varchar (как std :: string), поэтому теперь я хочу объявить переменную c ++ item_name (std :: string), тип которой будет соответствоватьв этот столбец ITEM_NAME (varchar).Ниже я попробовал кое-что (пример кода), но это не работает:

template<string coltype>
struct DatabaseType
{
   typedef COL_TYPE std::string;
};

template<string coltype="int">
{
   typedef COL_TYPE int;
};

std::string getDBType()
{
return "int"; 
}
int main()
{
DataBaseType<std::string("int")>::COL_TYPE x;
//need to call another overloaded function that returns value corresponding to DB Column name in x
getDBValue("ITEM_NAME",x); //note this is already defined overloaded function that can take std::string,float and int in place of second argument
return 0;
};

1 Ответ

0 голосов
/ 06 декабря 2018

Скорее всего, это чепуха, но в принципе это возможно:

template<size_t N>
struct DatabaseType
{
   typedef int COL_TYPE;
};

unsigned constexpr const_hash(char const *input) {
   return *input ?
      static_cast<unsigned int>(*input) + 33 * const_hash(input + 1) :
      5381;
}

template<>
struct DatabaseType<const_hash("int")>
{
   typedef int COL_TYPE;
};

template<>
struct DatabaseType<const_hash("float")>
{
   typedef float COL_TYPE;
};

template<>
struct DatabaseType<const_hash("string")>
{
   typedef std::string COL_TYPE;
};

void main()
{
   auto i = DatabaseType<const_hash("int")>::COL_TYPE(10);
   auto f = DatabaseType<const_hash("float")>::COL_TYPE(1.0);
   auto f = DatabaseType<const_hash("string")>::COL_TYPE("dasdas");
}

Это не имеет смысла, потому что enum намного проще:

enum Types
{
   TYPE_INT,
   TYPE_FLOAT,
   TYPE_STRING
};

template<Types N>
struct DatabaseType
{
   typedef int COL_TYPE;
};

template<>
struct DatabaseType<TYPE_INT>
{
   typedef int COL_TYPE;
};

template<>
struct DatabaseType<TYPE_FLOAT>
{
   typedef float COL_TYPE;
};

template<>
struct DatabaseType<TYPE_STRING>
{
   typedef std::string COL_TYPE;
};



void main()
{
   auto i = DatabaseType<TYPE_INT>::COL_TYPE(10);
   auto f = DatabaseType<TYPE_FLOAT>::COL_TYPE(1.0f);
   auto f = DatabaseType<TYPE_STRING>::COL_TYPE("dasdas");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...