C++11 原子类型的数值极限

C++11 原子类型的数值极限,c++11,c++14,atomic,stdatomic,numeric-limits,C++11,C++14,Atomic,Stdatomic,Numeric Limits,假设someAtomic是一个std::atomic,具有一个整型的底层类型,例如atomic\u uint16\u t。但是,我不想假设哪种整数类型,特别是在特定代码中,因此我希望实现以下功能,但目前无法编译: if (newVal > numeric_limits<decltype(someAtomic)>::max()) throw "newVal too large"; else someAtomic.store(newVal, memory_order_release

假设someAtomic是一个std::atomic,具有一个整型的底层类型,例如atomic\u uint16\u t。但是,我不想假设哪种整数类型,特别是在特定代码中,因此我希望实现以下功能,但目前无法编译:

if (newVal > numeric_limits<decltype(someAtomic)>::max()) throw "newVal too large";
else someAtomic.store(newVal, memory_order_release);
if(newVal>numeric_limits::max())抛出“newVal太大”;
其他一些原子存储(newVal、内存\u顺序\u释放);
看起来至少在VC++2015中,原子类型没有数字限制专门化,即使它们的底层类型确实有这样的专门化。处理这个问题的最佳方法是什么?

< P> C++允许(并且鼓励)你将专业化添加到 STD::数字限制> /Cord>,你可以做到。

#include <limits>
#include <atomic>
#include <iostream>

template<typename T>
class std::numeric_limits<std::atomic<T>> : public std::numeric_limits<T> {};

int main()
{
    std::cout << std::numeric_limits<std::atomic<int>>::max();
} 
#包括
#包括
#包括
模板
类别std::numeric_limits:公共std::numeric_limits{};
int main()
{
STD::CUT> P> C++标准允许(并鼓励)你将专业添加到 STD::数字限制,你可以做到。

#include <limits>
#include <atomic>
#include <iostream>

template<typename T>
class std::numeric_limits<std::atomic<T>> : public std::numeric_limits<T> {};

int main()
{
    std::cout << std::numeric_limits<std::atomic<int>>::max();
} 
#包括
#包括
#包括
模板
类别std::numeric_limits:公共std::numeric_limits{};
int main()
{
std::cout
模板
结构my_numeric_limits:std::numeric_limits{};
模板
结构my_numeric_limits:my_numeric_limits{};
然后可以使用
my\u numeric\u limits::max()

与向不依赖于用户提供的类型的
std::numeric_limits
添加专门化相比,这不太可能违反标准的(模糊)部分。在C++11中,有一些要求专门化为“用户定义的类型”,如果
std::atomic
是用户定义的,我不确定这个问题是否得到解决。我看到了一个修复方案,但不确定它是否得到了解决

无论如何,这遵循了最小意外的原则,并且同样有效。只有在备选方案不可行的情况下,才应该在
std
名称空间中处理事情

如果出现错误,您的代码会突然变得格式不正确,无需诊断。检查代码的人会受到正确的恐惧。修改代码的人不必出错。
my\u numeric\u limits
功能强大、安全,并且能够抵抗错误。

template
结构my_numeric_limits:std::numeric_limits{};
模板
结构my_numeric_limits:my_numeric_limits{};
然后可以使用
my\u numeric\u limits::max()

与向不依赖于用户提供的类型的
std::numeric_limits
添加专门化相比,这不太可能违反标准的(模糊)部分。在C++11中,有一些要求专门化为“用户定义的类型”,如果
std::atomic
是用户定义的,我不确定这个问题是否得到解决。我看到了一个修复方案,但不确定它是否得到了解决

无论如何,这遵循了最小意外的原则,并且同样有效。只有在备选方案不可行的情况下,才应该在
std
名称空间中处理事情


如果出现错误,您的代码会突然变得格式不正确,不需要诊断。检查代码的人会感到害怕。修改代码的人不必出错。
my\u numeric\u limits
是健壮、安全的,并且可以抵抗错误。

我不确定是否允许您使用标准模板中的类型专门化标准模板rd库如果这是允许的,我会非常惊讶。你能支持你的声明吗?我不确定你是否被允许用标准库中的类型专门化标准模板。如果这是允许的,我会非常惊讶。你能支持你的声明吗?