假设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特化。处理这个问题的最佳方法是什么?
答案 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();
}