我不得不承认,我尽量避开模板。我想改变这一点。他们不应该那么可怕。
如果我的函数声明如下:
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;
}令人困惑的是,输入的参数是相同的,除了返回向量是不同的。
有人能帮助我理解如何开始应用模板来重用代码吗?
发布于 2014-04-18 18:32:55
你可以这样做:
template<typename SQLObject>
std::vector<SQLObject> executeSelectQueryReturnSingleInt(std::string _sql) {
...
}然后你就把它叫做,例如,
executeSelectQueryReturnSingleInt<SQLPlantObject>("rose");请注意,您必须显式地指定模板参数,因为它们不能从函数参数中推导出来,但否则会像您预期的那样工作。
发布于 2014-04-18 18:35:38
在这种情况下,模板参数将是返回类型。然后,您必须在调用函数时显式使用它,因为它不能从函数参数中推断出来:
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);https://stackoverflow.com/questions/23160025
复制相似问题