【发布时间】:2012-05-12 08:00:21
【问题描述】:
我想写一个可以操作不同类型数据库(例如sqlite、postgres等)的数据库包装器,这样用户正在编写的代码无论他们实际使用什么数据库都不会改变。
在我看来,这需要一个抽象基类,例如:
class database {
public:
virtual bool query(const std::string &q) = 0;
// Other stuff
};
class sqlite : public database {
public:
bool query(const std::string &q) {
// Implementation
}
};
这看起来不错,但我使用可变参数模板来转义查询中的参数(我真的很喜欢这个想法,所以我想坚持下去!),所以不幸的是我的基类看起来像:
class database {
public:
template <typename... Args>
bool query(const std::string &q, const Args &... args) {
// Implementation
}
};
然而,这阻碍了创建抽象类,因为模板函数不能是虚拟的。到目前为止我唯一想到的就是这个结构
template <class DatabaseType>
class database {
public:
template <typename... Args>
bool query(const std::string &q, const Args &... args) {
return database_.query(q, args...);
}
private:
DatabaseType database_;
};
虽然这似乎可行,但所有包装器都只调用同名的database_ 函数,但对我来说它看起来不是一个很好的样式。这是这里选择的设计模式,还是有更简洁或更惯用的方式?
【问题讨论】:
标签: c++ templates inheritance c++11 variadic-templates