我想写一个签名函数模板。我是这样做的:
template<class T> T sign(const T &value)
{
if (value > 0) return 1;
else if (value < 0) return -1;
return 0;
}
它正在工作,但我不确定当实际上我的函数应该返回T时返回数值是否合适。这个函数是否正常?
答案 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)
只有在从int
到T
的隐式转换时,您的函数才会被编译。如果你的意图是可以的,但它看起来并不好。
我认为如果您重写代码以返回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(隐式类型转换,如果需要);