表达模板化负数字文字的首选方式

时间:2015-10-15 18:12:05

标签: c++ templates c++11

尽管关于模板化数字文字的使用有一个很好的question,但它没有提到数字文字是负值时的情况。

应该首选哪种变体?为什么?

A

template <typename T>
T expr(T x)
{
    constexpr T scale = T(-9.0);
    return x * scale;
}

template <typename T>
T expr(T x)
{
    constexpr T scale = -T(9.0);
    return x * scale;
}

2 个答案:

答案 0 :(得分:6)

我赞成A超过B.

选项A假设类型不是B,因为一元<input type="text" ng-model="city.name" class="form-control" ng-disabled="!country.name" name="name"> <input type="text" ng-model="country.name" class="form-control"> 可能没有为所有类型定义好(例如溢出条件等,但对数字文字来说很好)。这对眼睛来说更容易一些。

当然,问题是数字类型,所以要么就好了。

答案 1 :(得分:4)

假设您只讨论算术类型(否则operator-可能会重载以做一些奇怪的事情)......

它们对所有算术类型产生相同的结果,除了最负值(见下文),但 A 更常规,不太可能混淆人。仅此一点就足以让我更喜欢 A

A 可用于该类型的整个值范围,但 B 不能例如。

short a = short(-32768);
assert( a == -32768 );
short b = -short(32768);
assert( b == -32768 );  // FAIL!

这是因为32768不是简短的有效值,因此无法通过否定(short)-32768来生成值(short)32768