有没有办法避免函数重载并使用模板编写更通用的函数?目前,我的代码如下所示:
placement Detect::predict(Eigen::Array<double, rowSize, 1> &feature)
和
position Detect::predict(std::unordered_map<std::string, std::vector<double>> &feature)
在上文中,placement
和position
是各种类别的ENUMS。
如何使用template
?
答案 0 :(得分:1)
不幸的是,从您发布的代码开始,无法提供使用相同类和名称的解决方案 无论如何,也许你可以依靠sfinae表达来做你想做的事。
举个例子:
#include<type_traits>
template<typename T>
constexpr
std::enable_if_t<std::is_same<T, int>::value, char>
func(T) { return 'c'; }
template<typename T>
constexpr
std::enable_if_t<not std::is_same<T, int>::value, int>
func(T) { return 42; }
int main() {
static_assert(func(42) == 'c', "!");
static_assert(func(.0) == 42, "!");
}
在上面的示例中,如果参数的类型为func
,则char
会返回int
,否则会返回int
。
您必须根据您的要求简单地调整类型和sfinae表达式。
注意强>
我不是说OP不应该超载。相反,我认为在这种情况下会更好 此答案仅尝试通过使用模板显示OP如何到达目标。
答案 1 :(得分:0)
是的,你可以做到。 我认为你想模拟你的检测功能,并将容器作为类型传入。
您需要做的是将所需的返回类型与容器类型相关联。如果没有现有的固定关系,您可以使用类型特征概念(我不是指另一个答案中使用的类型特征标题)
基本上,您创建一个新模板类,其中包含一个typedef或using语句,该语句将用作检测函数的返回类型。这些返回类型可以包装枚举。
您需要为每个需要使用的容器类型专门设置此特征类(可能必须在此处使用模板模板参数)
抱歉,我现在无法提供示例,但如果您需要更多时间,我会有更多时间和合适的键盘来更新答案。