我可以以某种方式优雅地禁止在模板函数中使用未签名的变量吗?

Lea*_*pcs 1 c++ templates overloading

考虑这段代码:

template <typename T>
T abs(const T& n)
{
    if (!std::is_signed<T>::value)
        throw logic_error;
    if (n < 0)
        return -n;
    return n;
}
Run Code Online (Sandbox Code Playgroud)

我想完全禁止我的函数与变量的使用unsigned,因为它没有意义,而且可能用户甚至不知道他使用了变量unsigned。例如,我可以在某种程度上避免这个问题:

template <typename T>
T abs(const T& n)
{
    if constexpr(!std::is_signed<T>::value)
        n += "";
    if (n < 0)
        return -n;
    return n;
} 
Run Code Online (Sandbox Code Playgroud)

但如果我调用abs(4u),编译器错误不是很明显。就像是"can't apply += const char[1] to double"。我可以让它更明显吗?或者只是进行多次重载?

Dav*_*son 5

#include <type_traits>

template <typename T>
T abs(T n)
{
  static_assert(std::is_signed<T>::value, "Type must be signed.");
  if (n < 0) { return -n; }
  return n;
}

int main()
{
    return abs(3u);
}
Run Code Online (Sandbox Code Playgroud)