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使用nameT
可能是规范,但使用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);