Я хотел бы реализовать оболочку класса для базы данных.
В настоящее время я работаю над функцией createTable.
Я пытался заставить ее работать так, чтобы пользователь определял типы
в качестве параметров шаблона и имен столбцов в качестве списка инициализатора, это шаблон функции:
template <typename ... Ts>
bool createTable(const std::string & tableName, const std::initializer_list<std::string> & columnNames);
И это тело метода:
template<typename ... Ts>
bool DatabaseConnection::createTable(const std::string &tableName, const std::initializer_list<std::string> & columnNames)
{
constexpr size_t num_cols = sizeof...(Ts);
assert(num_cols == columnNames.size());
auto typetuple = std::tuple<Ts...>();
std::vector<std::tuple<std::string, std::string>> columnNameAndType(num_cols);
auto columnNameIterator = columnNames.begin();
for(unsigned it = 0; it++ < columnNames.size(); it++){
typedef std::tuple_element<it, typetuple>::type c; // non-type template argument is not a constant expression
if(is_same<c, int> ...) //pseudocode
std::string dbtype = "INTEGER"; //pseudocode
}
}
К сожалению, строка tuple_element не работает, потому что она не является константным выражением. Теперь кто-то может спросить, почему я хочу назвать это так: createTable<int, std::string>("Users", {"ID", "Name"});
вместо того, чтобы просто пропустить два списка инициализаторов?
Ну, я просто хочу дистанцировать пользователя от интерфейса - если бы я мог определить тип it-h, я мог бы просто использовать что-то вроде decltype или is_same, чтобы определить тип, используемый в запросе на создание базы данных - пользователь просто говорит, какой тип он / она хочет, и класс Database определяет наилучший тип базы данных, соответствующий запросу пользователя.
Теперь это можно сделать с помощью списков инициализаторов, но это не будет временем компиляции, и Мне просто любопытно посмотреть, возможно ли это в полное время.
Я надеюсь, что моего объяснения проблемы достаточно.
Конечно, это в основном теоретическая проблема, но я думаю, что многие люди заинтересуются в таком синтаксисе, и я пока не нашел каких-либо решений по inte rnet.