繁体   English   中英

使用具有不同输入参数和不同返回类型的模板的通用函数

[英]A generic function using templates with different input arguments and different return type

有没有办法避免函数重载并使用模板编写更通用的函数? 目前,我的代码如下所示:

placement Detect::predict(Eigen::Array<double, rowSize, 1> &feature)

position Detect::predict(std::unordered_map<std::string, std::vector<double>> &feature)

上面的placementposition是各种类别的ENUMS。

如何使用template编写此内容?

不幸的是,从您发布的代码开始,无法提供使用相同类和名称的解决方案。
无论如何,也许您可​​以通过依赖 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, "!");
}

在上面的例子中,如果参数的类型是intfunc返回一个char ,否则它返回一个int
您必须根据您的要求简单地调整类型和 sfinae 表达式。

笔记

我并不是说 OP 不应该重载。 相反,我认为在这种情况下会更好。
此答案仅尝试展示 OP 如何使用模板到达目标。

是的,你可以做到。 我假设您想使用作为类型传入的容器来模板化您的检测功能。

您需要做的是将所需的返回类型与容器类型相关联。 如果没有现有的固定关系,您可以使用类型特征概念(我不是指另一个答案中使用的类型特征标头)

基本上,您创建一个新的模板类,其中包含将用作检测函数的返回类型的 typedef 或 using 语句。 这些返回类型可以包装枚举。

您为每个需要使用的容器类型专门指定了这个 trait 类(可能必须在此处使用模板模板参数)

抱歉,我现在无法举例,但如果您需要更多时间和合适的键盘,我会更新答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM