【问题标题】:A generic function using templates with different input arguments and different return type使用具有不同输入参数和不同返回类型的模板的通用函数
【发布时间】:2016-05-06 17:08:22
【问题描述】:

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

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

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

在上面,placementposition 是具有各种类别的 ENUMS。

如何使用template 编写此内容?

【问题讨论】:

  • IMO 无法在您的函数中使用模板。
  • 好的。所以为了澄清我的理解,输入参数和返回类型应该相同才能使用模板?
  • 没有参数和返回类型不必与模板参数相同,但是没有简单或优雅的方法来制作可以处理这两种情况的单个函数,哪种类型(返回或参数)应该被模板化?一个或另一个或两者兼而有之?您将如何区分这些实现?在我看来,重载是最好的方法,如果两个函数之间有共同的代码,把共同的代码放在你可以调用的第三个函数中。
  • 好的,谢谢大家。
  • 好吧,您的返回类型可以是您想要的任何类型,但输入参数应该以某种方式相关。也许有我看不到的关系。如果有它们的实现,我可以说更多。

标签: c++ templates generics overloading


【解决方案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, "!");
}

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

注意

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

【讨论】:

  • 谢谢。让我看看我是否可以相应地修改我的代码。
  • 投反对票的人:至少有一条评论有助于了解投反对票的目的。谢谢。
【解决方案2】:

是的,你可以做到。 我想你想用作为类型传入的容器来模板化你的检测函数。

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

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

你为每个你需要使用的容器类型专门化了这个 trait 类(这里可能必须使用模板模板参数)

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

【讨论】:

  • 谢谢罗克斯。目前,没有固定的关系。如果你能提供一个例子,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多