gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:46:12 29 4
gpt4 key购买 nike

根据 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 );

<cinttypes> 中的两个 div

我宁愿看到

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 的类型怎么办? ?好吧,不会选择任何特化,因为只有在完全匹配时才会选择它们,并且该类型不属于它们。所以我必须使用 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};
}

关于c++ - 为什么 div、ldiv 和 lldiv 不是模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44991956/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com