【发布时间】:2014-12-10 13:33:37
【问题描述】:
以下代码可能是 ORM 实现的开始,但我遇到了一些元编程方面的问题(这并不奇怪)。下面的代码将是开发类的开始,这些类可以创建它们的表(然后读取和写入它们的行)。但是我已经在 main 中的那个嵌套表声明上得到了邪恶的“刽子手缩进”(有人想链接那个 xkcd 漫画吗???)。所以我想要的是使用可变参数模板参数包将嵌套格式更改为平面列表。
如何使用可变参数模板将 main 中的嵌套类型列表更改为平面列表?
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
struct nil {
static const string create() {return string("");}
};
struct required {};
struct optional {};
template <const char* nm,typename req=required>
struct serial {
static const string create() {return string(nm)+" INTEGER PRIMARY KEY NOT NULL";}
};
template <const char* nm,typename req=required>
struct integer {
static const string create() {return string(nm)+" INTEGER NOT NULL";}
};
template <const char* nm>
struct integer<nm,optional> {
static const string create() {return string(nm)+" INTEGER";}
};
template<typename car,typename cdr>
struct cons {
static const string create() {
return
string("\t")
+car::create()
+",\n"
+cdr::create();
}
};
template<typename car>
struct cons<car,nil> {
static const string create() {
return
string("\t")+car::create();
}
};
template<typename DDL>
struct table {
static const string create() {
return
string("CREATE TABLE (\n")
+DDL::create()
+"\n);";
}
};
namespace fields {
const char id[]="id";
const char someint[]="someint";
const char someint2[]="someint2";
};
int main(int argc,char* argv[]) {
typedef table<
cons<serial<(const char*)fields::id>,
cons<integer<(const char*)fields::someint>,
cons<integer<
(const char*)fields::someint2,optional>,nil
>
>
>
> test;
cout << test::create() << endl;
return 0;
}
代替:
typedef table<
cons<serial<(const char*)fields::id>,
cons<integer<(const char*)fields::someint>,
cons<integer<
(const char*)fields::someint2,optional>,nil
>
>
>
> test;
我希望能够使用:
typedef table<
list<
serial<(const char*)fields::id>,
integer<(const char*)fields::someint>,
integer<(const char*)fields::someint2,optional>
>
> test;
【问题讨论】:
标签: c++ metaprogramming variadic-templates typelist