To do this you simply have to use the tuple as the class container(which you can typedef however its pleases you) and create the Database Adapter with a few of variadic templates that auto generate the SQL commands for data handling. Here is an example of generating the CREATE TABLE command for an sql-lite database adapter.
#include <iostream>
#include <string>
#include <sstream>
template <typename T>
std::string to_string(T t)
{
//hmm this is missing!
std::stringstream ss;
ss << t;
return ss.str();
}
template <typename I>
struct SchemaType
{
};
template <>
struct SchemaType<int>
{
static constexpr const char* type = "INTEGER";
};
template <>
struct SchemaType<float>
{
static constexpr const char* type = "REAL";
};
template <>
struct SchemaType<char*>
{
static constexpr const char* type = "TEXT";
};
//CREATE TABLE t(x INTEGER, y, z, PRIMARY KEY(x DESC));
template <typename... II>
struct AutoSchemaCore;
template <typename I, typename... II>
struct AutoSchemaCore<I, II...>
{
static std::string create_params()
{
std::string ret = "a"
+ to_string(sizeof...(II))
+ " "
+ SchemaType<I>::type;
if (sizeof...(II) > 0)
{
ret += ","
+ AutoSchemaCore<II...>::create_params();
}
return ret;
}
};
template <>
struct AutoSchemaCore<>
{
static std::string create_params()
{ return ""; }
};
template <typename I, typename... II>
struct AutoSchema
{
static std::string create_table(const char* tablename)
{
// CREATE TABLE t(x INTEGER, y, z, PRIMARY KEY(x DESC));
return std::string("CREATE TABLE ")
+ tablename
+ "("
+ AutoSchemaCore<I,II...>::create_params()
+ ");";
}
};
int main()
{
//generate the CREATE TABLE t(...) SQL command
std::cout << AutoSchema<float>::create_table("tableA") << "\n";
std::cout << AutoSchema<int,char*,float>::create_table("tableB") << "\n";
}
Result
CREATE TABLE tableA(a0 REAL); CREATE TABLE tableB(a2 INTEGER,a1 TEXT,a0 REAL);
No comments:
Post a Comment