为什么 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_cast
ing 到正确的超载。
在这里,通用解决方案会更合适,因为这些功能之间存在一些重复。也许是这样的:
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};
}
根据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_cast
ing 到正确的超载。
在这里,通用解决方案会更合适,因为这些功能之间存在一些重复。也许是这样的:
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};
}