C ++模板会帮助重用非常相似的代码吗?

时间:2014-04-18 18:30:41

标签: c++ templates c++11

我必须承认我尽可能避开模板。我想改变这一点。他们不应该那么可怕。

如果我声明的函数如下:

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;
}

令人困惑的是进入的参数是相同的,除了返回向量不同。

任何人都可以帮助我了解如何开始将模板应用于代码重用吗?

2 个答案:

答案 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);