0

假设 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 特化,即使它们的底层类型确实具有这样的特化。处理这个问题的最佳方法是什么?

4

2 回答 2

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 中,有一些要求你专门研究“用户定义的类型”,我不确定这是否已经解决,如果std::atomic<int>是用户定义的。我看到了一个修复建议,但不确定它是否会去任何地方。

无论如何,这遵循最小意外的原则,并且同样有效。std只有当替代方案不切实际时,才应该在命名空间中乱搞。

出了点问题,你的代码突然变得格式不正确,不需要诊断。检查您的代码的人会感到害怕。修改您的代码的人不必搞砸。 my_numeric_limits是健壮的,安全的,并且可以抵抗错误。

于 2017-07-26T20:08:35.150 回答
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();
} 
于 2017-07-26T19:40:52.083 回答