我正在包装一些sqlite的东西,我想知道是否可以使用模板来避免使用新方法包装每种类型。但是,我绝对迷路了,摸索着模板。我找不到很好的教程。
这就是我的Statement类现在的样子
class Statement {
public:
Statement();
~Statement();
void BindInt(int index, int value);
void BindInt(std::string name, int value);
void BindInt64(int index, int value);
void BindInt64(std::string name, int value);
void BindText(int index, std::string value);
void BindText(std::string name, std::string value);
};
Statement::Statement(){}
Statement::~Statement(){}
void Statement::BindInt(int index, int value){}
void Statement::BindInt(std::string name, int value){}
void Statement::BindInt64(int index, int value){}
void Statement::BindInt64(std::string name, int value){}
void Statement::BindText(int index, std::string value){}
void Statement::BindText(std::string name, std::string value){}
我觉得我可以写一些其他通用的东西,例如
class Statement {
public:
Statement();
~Statement();
template<class T, class V>
void Bind(T param, V value);
};
Statement::Statement(){}
Statement::~Statement(){}
template<class T, class V>
void Statement::Bind(T index, T value){}
但是我将需要知道传入的是哪种类型的值,value
以便可以调用正确的基础函数,例如sqlite_bind_int
或sqlite_bind_text
,等等。这可能吗?
但是我需要知道在值中传递了哪种类型的值...。
您确实知道类型。是的V
。
...这样我就可以调用正确的基础函数,例如sqlite_bind_int或sqlite_bind_text等。这可能吗?
如果您需要为传递的每种类型调用不同的方法,因为value
使用模板不会带来太多好处。您最终将为每种可能的类型编写一个特殊化名称以调用相应的sqlite_bind_XY
函数。通过重载,您可以轻松地获得相同的效果:
class Statement {
public:
Statement();
~Statement();
void Bind(int index, int value); // aka BindInt
void Bind(std::string name, int value);
void Bind(int index, int64_t value); // aka BindInt64
void Bind(std::string name, int64_t value);
void Bind(int index, std::string value); // aka BindText
void Bind(std::string name, std::string value);
};
请注意,我不得不改变int
,以int64_t
使他们不同。您将在模板上遇到同样的问题。有时,没有明显的方法可以使参数不同,然后可以使用标签:
class Statement {
public:
struct text_tag{};
struct int_tag{};
struct int64_tag{};
Statement();
~Statement();
void Bind(int_tag,int index, int value); // aka BindInt
void Bind(int_tag,std::string name, int value);
void Bind(int64_tag,int index, int value); // aka BindInt64
void Bind(int64_tag,std::string name, int value);
void Bind(text_tag,int index, std::string value); // aka BindText
void Bind(text_tag,std::string name, std::string value);
};
粗略的经验法则是:要为每种类型做不同的事情时,请使用重载;而要为每种类型做相同的事情时,请使用模板。
PS:正如@Mils Budnek指出的那样,“您可以为类IMO提供一个更好的接口,但是在这种情况下,模板肯定不会导致更简单的代码。” 我同意,但是专注于倡导超载;)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句