使用具有不同输入参数和不同返回类型的模板的泛型函数
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)
在上文中,placement
和position
是具有各种类别的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, "!");
}
在上面的示例中,如果参数的类型是int
,则func
返回char
,否则返回int
您必须简单地根据您的要求调整类型和sfinae表达式。
注意
我并不是说OP不应该超载。相反,我认为在这种情况下会更好
这个答案只是试图展示OP如何通过使用模板来达到目标。
是的,你可以做到。我想你想用传递的容器作为类型来模板化你的检测函数。
您需要做的是将所需的返回类型与容器类型关联起来。如果没有现有的固定关系,你可以使用类型特征概念(我不是指在另一个答案中使用的类型特征标题)
基本上,您创建了一个新的模板类,其中包含一个typedef或using语句,该语句将用作检测函数的返回类型。这些返回类型可以包装枚举。
你专门为你需要使用的每个容器类型(可能必须在这里使用模板模板参数)
很抱歉,我现在不能举例,但当我有更多的时间和一个合适的键盘时,如果你需要更多,我会更新答案。
相关文章:
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 链表的泛型函数remove()与成员函数remove)
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 泛型枚举和其他类型的重载模板函数
- 可变参数泛型 lambda 和函数重载
- 以特征类型作为参数的泛型函数回调
- 传递非泛型函数的最有效方法是什么?
- 泛型模板函数始终返回整数值
- 泛型函数反向打印任何矢量,编译器出错
- C++泛型包装类,它为某些函数添加了额外的处理
- 是否可以在C++中创建泛型函数指针?
- 必须具有泛型接口的函数,但必须根据传递的子类(不知道它们是什么!)以不同的行为 - C++
- 是否可以使用泛型枚举类型作为函数的参数?
- 将泛型函数及其参数传递给元函数
- 如何在带有约束 (C++) 的函数中使用泛型类型
- 获取模板函数/泛型 lambda 的唯一返回类型
- 这是为浮点数/双精度函数泛型的正确方法吗?
- 使字段函数泛型
- 将函数泛型地传递给c++模板
- 我如何使这个函数泛型,以便它接受任何容器