为什么 div、ldiv 和 lldiv 不是模板?

Why are div, ldiv and lldiv not templates?

根据this,有

std::div_t     div( int x, int y );
std::ldiv_t    div( long x, long y );
std::lldiv_t   div( long long x, long long y );
std::ldiv_t   ldiv( long x, long y );
std::lldiv_t lldiv( long long x, long long y );

两个 div 在 <cinttypes>

我更愿意看到

template<typename t>
std::div_t<T> div(T x, T y);
template<>
std::div_t<int> div(int x, int x)
{
  // implementation here
}

想法?

您是说您想使用模板特化而不是重载?这不是个好主意。

首先,如果我使用的类型具有 long 的转换运算符怎么办?好吧,none 的专业化将被选中,因为只有在完全匹配时才会采用它们,并且该类型不属于它们。所以我必须使用static_cast。这不是运算符重载的情况,这种转换是允许的并且将会发生。

其次,你通过这样的专业化获得了什么优势?您仍然必须为每个专业编写相同的实现。此外,您不能轻易将实现写在源文件中。

我能看到的唯一优点是获取函数特定版本的地址要容易得多,就像使用模板一样,您可以 &std::div<int> 而不是 static_casting 到正确的超载。

在这里,通用解决方案会更合适,因为这些功能之间存在一些重复。也许是这样的:

template<typename T>
concept Integral = std::is_integral_v<T>;

template <Integral T>
struct cdiv_t {
    T quot{};
    T rem{};
};

constexpr auto cdiv(Integral auto x, Integral auto y) noexcept {
    return cdiv_t{x / y, x % y};
}