我正在包装一些sqlite的东西,我想知道是否可以使用模板来避免使用新方法包装每种类型。但是,我绝对迷路了,摸索着模板。我找不到很好的教程。
这是我的Statement类现在的样子
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
或{{1}}等。这可能吗? / p>
答案 0 :(得分:3)
但是我需要知道在值中传递了哪种类型的值...。
您所知道的类型。是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,但是模板肯定不会导致这种情况下,简单的代码。”我同意,但是专注于提倡超载;)。