在C++中如何从参数值模拟返回值是唯一的?

Yel*_*aYR 4 c++ templates overloading class function

在C++中如何从参数值模拟返回值是唯一的?我的代码如下所示 - 现在如果数字的数据类型为int,我希望它作为双出去.

template <class T>
T divide(T number)
 {
    return number/10;
 }
Run Code Online (Sandbox Code Playgroud)

在主要我有这个

 divide(5);
 divide(2.5);
Run Code Online (Sandbox Code Playgroud)

在2.5的情况下,进入和退出的值将是double类型,因此没有问题,但在5的情况下,它作为int进入,但我需要它不被截断并返回为double类型.

template <class T, Class T1>
T1 divide(T number)
 {
    return number/10;
 }
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它在函数中寻找两个参数.

T1 template <class T>
T1 divide(T number)
 {
    return number/10;
 }
Run Code Online (Sandbox Code Playgroud)

这给了我没有存储类或类型说明符的声明 - 当我在T1之前将该单词class添加到该行时,我收到错误消息:function返回不完整的类型.

MSa*_*ers 9

最通用的方法是使用辅助模板

template <typename T>
struct calc_return {
  using type = T;
};

template <class T>
typename calc_return<T>::type divide(T number)
{
   return number/10;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果规则有例外,您可以专门calc_return使用您想要的任何逻辑:

// Prior to the declaration of divide()
template <>
struct calc_return<int> {
  using type = double;
};
Run Code Online (Sandbox Code Playgroud)

  • 老实说,我不是 100% 确定,我了解这里正在做什么。 (2认同)

MSa*_*ers 6

在这种情况下,我认为你想要

template <class T>
auto divide(T number) -> decltype(number/10.0)
{
   return number/10.0;
}
Run Code Online (Sandbox Code Playgroud)

如果您至少除以 10.0 而不是 10,编译器就会知道返回类型应该是什么。

或 C++14 风格:

template <class T>
auto divide(T number) // Compiler will figure it out from the return statement.
{
   return number/10.0;
}
Run Code Online (Sandbox Code Playgroud)