我必须承认我尽可能避开模板。我想改变这一点。他们不应该那么可怕。
如果我声明的函数如下:
std::vector<SQLFieldObject> executeSelectQueryReturnSingleInt(std::string _sql);
std::vector<SQLPlantObject> executeSelectQueryReturnSingleInt(std::string _sql);
std::vector<SQLOrderObject> executeSelectQueryReturnSingleInt(std::string _sql);
executeSelectQueryReturnSingleInt(std::string _sql)
中的位置每个函数的代码完全相同。我创建了std::vector
的本地版本并将其返回。
我想要一个通用的executeSelectQueryReturnSingleInt(std::string _sql)
函数。
模板可以解决这个问题,对吗?查看示例模板
template <class SomeType>
SomeType sum (SomeType a, SomeType b)
{
return a+b;
}
令人困惑的是进入的参数是相同的,除了返回向量不同。
任何人都可以帮助我了解如何开始将模板应用于代码重用吗?
答案 0 :(得分:4)
你可以这样做:
template<typename SQLObject>
std::vector<SQLObject> executeSelectQueryReturnSingleInt(std::string _sql) {
...
}
然后你将其称为,例如,
executeSelectQueryReturnSingleInt<SQLPlantObject>("rose");
请注意,您必须明确指定模板参数,因为它们不能从函数参数中推断出来,否则这就像您期望的那样。
答案 1 :(得分:2)
在这种特殊情况下,模板参数将是返回类型。然后,在调用函数时必须显式使用它,因为它不能从函数参数中推断出来:
template <typename ReturnType>
ReturnType executeSelectQueryReturnSingleInt(std::string sql)
{
return ReturnType(args....);
}
然后
auto x = executeSelectQueryReturnSingleInt<std::vector<SQLFieldObject>>(sqlstr);
如果您只想返回特定类型的std::vector
,那么
template <typename SQLObjType>
std::vector<SQLObjType> executeSelectQueryReturnSingleInt(std::string sql)
{
return std::vector<SQLObjType>(args....);
}
和
auto x = executeSelectQueryReturnSingleInt<SQLFieldObject>(sqlstr);