原子类型的numeric_limits

时间:2017-07-26 19:16:40

标签: c++11 c++14 atomic stdatomic numeric-limits

假设someAtomic是一个带有整数底层类型的std :: atomic,例如atomic_uint16_t。我不想假设WHICH积分类型,但是,特别是代码,所以我想要完成以下内容,现在不能编译:

if (newVal > numeric_limits<decltype(someAtomic)>::max()) throw "newVal too large";
else someAtomic.store(newVal, memory_order_release);

至少在VC ++ 2015中,即使它们的基础类型确实具有这样的特化,也没有针对原子类型的numeric_limits特化。处理这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

template<class T>
struct my_numeric_limits : std::numeric_limits<T>{};

template<class T>
struct my_numeric_limits<std::atomic<T>> : my_numeric_limits<T>{};

然后您可以使用my_numeric_limits<SomeAtomic>::max()

除了向std::numeric_limits添加不依赖于用户提供的类型的特化之外,这不太可能违反(模糊)标准部分。在C ++ 11中,有些需求专门针对用户定义的类型&#34;,如果std::atomic<int>是用户定义的,我不确定是否已经解决了这个问题。我看到了一个修正提案,但我不确定它是否已经到位。

无论如何,这都遵循最少惊喜的原则,同样有效。只有当备选方案不切实际时,才应该在std名称空间中处理事情。

出错了,你的代码突然变得格格不入,无需诊断。人们检查你的代码是正确的害怕。修改代码的人不得不搞砸。 my_numeric_limits功能强大,安全且可抵御错误。

答案 1 :(得分:2)

C ++标准允许(并鼓励)您向std::numeric_limits添加专业化,您可以这样做。

#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();
}