可以从模板函数返回整数吗?

时间:2011-11-15 10:17:37

标签: c++ templates function

我想写一个签名函数模板。我是这样做的:

template<class T> T sign(const T &value)
{
    if (value > 0) return 1;
    else if (value < 0) return -1;
    return 0;
}

它正在工作,但我不确定当实际上我的函数应该返回T时返回数值是否合适。这个函数是否正常?

5 个答案:

答案 0 :(得分:7)

不,T可能是没有整数强制转换的类型。

在这种情况下,它将在编译时失败。

如果你想要它是一个整数设计,请声明它。

template<class T> int sign(const T &value)
{
    if (value > 0) return 1;
    else if (value < 0) return -1;
    return 0;
}

答案 1 :(得分:2)

只有在从intT的隐式转换时,您的函数才会被编译。如果你的意图是可以的,但它看起来并不好。

我认为如果您重写代码以返回T,可能会使用以下内容,这样会更好:

//return T(0);
return static_cast<T>(0); // Better alternative as suggested by Steve Jessop

这显式地从int构造了一个T。请注意,如果有人使用可以从T构造的int调用此方法,它将起作用 - 无论构造函数的真正含义是什么。

答案 2 :(得分:2)

有没有理由将T用作返回类型?您应该考虑将其更改为某个整数或enum{USINGNED,ZERO,SIGNED}。在这种情况下,只要T重载了运算符><,您的函数就会起作用。

答案 3 :(得分:1)

只要你能将-1/0/1转换为T,这就是将要发生的事情。我相信你想要实现的是拥有与输入相同类型的符号,所以你唯一能做的就是添加显式强制转换,这几乎没有任何区别 - 正如史蒂夫在评论中指出的那样,它会因为T而有所不同显式构造函数。

答案 4 :(得分:0)

我认为这很好,因为T会是数字,因为你想找出标志。 让我们看看调用函数。

double x = -5.2;
int ret = sign(x);

在最后一个语句中,sign将返回int常量,该常量将被赋值给ret(隐式类型转换,如果需要);