C++ 将C++;模板有助于重用非常相似的代码?

C++ 将C++;模板有助于重用非常相似的代码?,c++,templates,c++11,C++,Templates,C++11,我必须承认,我尽可能避免使用模板。我想改变这一点。他们不应该这么吓人 如果我的函数声明如下: std::vector<SQLFieldObject> executeSelectQueryReturnSingleInt(std::string _sql); std::vector<SQLPlantObject> executeSelectQueryReturnSingleInt(std::string _sql); std::vector<SQLOrderObject

我必须承认,我尽可能避免使用模板。我想改变这一点。他们不应该这么吓人

如果我的函数声明如下:

std::vector<SQLFieldObject> executeSelectQueryReturnSingleInt(std::string _sql);
std::vector<SQLPlantObject> executeSelectQueryReturnSingleInt(std::string _sql);
std::vector<SQLOrderObject> executeSelectQueryReturnSingleInt(std::string _sql);   
令人困惑的是,输入的参数是相同的,只是返回向量不同

有人能帮我理解如何开始将模板应用于代码重用吗?

您可以这样做:

template<typename SQLObject>
std::vector<SQLObject> executeSelectQueryReturnSingleInt(std::string _sql) {
    ...
}
模板
std::vector executeSelectQueryReturnSingleInt(std::string\u sql){
...
}
然后你把它叫做,比如

executeSelectQueryReturnSingleInt<SQLPlantObject>("rose");
executeSelectQueryReturnSingleInt(“rose”);

请注意,您必须显式指定模板参数,因为它们不能从函数参数中推导出来,但否则,这将像您预期的那样工作。

在这种特殊情况下,模板参数将是返回类型。然后,在调用函数时必须显式使用它,因为它无法从函数参数推导:

template <typename ReturnType>
ReturnType executeSelectQueryReturnSingleInt(std::string sql)
{
     return ReturnType(args....);
}

auto x=executeSelectQueryReturnSingleInt(sqlstr);

我的问题是,如何只重载具有不同返回类型的函数?@XiaogeSu只是编辑以澄清…我认为
模板std::vector executeSelectQueryReturnSingleInt(const std::string&sql)
可能更好。@XiaogeSu我添加了这个选项。那么我会创建一个
SQLObject
类,并将我的
SQLPlantObject
更改为子类
SQLObject
?否则我看不出SQLObjet从何而来不,
SQLObject
只是一个占位符名(类似于参数名)。实际上,规范是使用
typename T
,但我在这里选择了一个不同的名称,以便使预期的用法更清楚。@nneono你的意思是解决问题吗?@nneono使用name
T
可能是规范,但使用
typename
肯定不是,特别是考虑到有些情况下,@Chnossos您大错特错:
typename
是,在我的经验中,比
class
更经常使用,专门用于区分需要
class
的情况和允许互换使用
class
typename
的情况。
template <typename ReturnType>
ReturnType executeSelectQueryReturnSingleInt(std::string sql)
{
     return ReturnType(args....);
}
auto x = executeSelectQueryReturnSingleInt<std::vector<SQLFieldObject>>(sqlstr);
template <typename SQLObjType>
std::vector<SQLObjType> executeSelectQueryReturnSingleInt(std::string sql)
{
     return std::vector<SQLObjType>(args....);
}
auto x = executeSelectQueryReturnSingleInt<SQLFieldObject>(sqlstr);