0

据此

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
}

想法?

4

1 回答 1

2

你的意思是你想使用模板特化而不是重载?这不是一个好主意。

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

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

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

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

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};
}
于 2017-07-09T07:23:32.587 回答