numeric_limits 个原子类型
numeric_limits of atomic types
假设 someAtomic 是一个具有完整基础类型的 std::atomic,例如 atomic_uint16_t。但是,我不想假设哪种整数类型,特别是代码,所以我想要完成以下操作,但现在无法编译:
if (newVal > numeric_limits<decltype(someAtomic)>::max()) throw "newVal too large";
else someAtomic.store(newVal, memory_order_release);
看起来至少在 VC++2015 中没有 numeric_limits 原子类型的特化,即使它们的基础类型确实有这样的特化。处理此问题的最佳方法是什么?
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();
}
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 中,需要专门处理 "user defined types",如果 std::atomic<int>
是用户定义的,我不确定这个问题是否已经解决。我看到了一个修复建议,但不确定它是否适用。
无论如何,这遵循了最小意外原则,并且同样有效。只有在替代方案不切实际时,才应在 std
命名空间中乱搞东西。
出了点问题,您的代码突然变得格式错误,不需要诊断。检查您的代码的人理所当然地感到害怕。修改你的代码的人不能搞砸。 my_numeric_limits
稳健、安全且不易出错。
假设 someAtomic 是一个具有完整基础类型的 std::atomic,例如 atomic_uint16_t。但是,我不想假设哪种整数类型,特别是代码,所以我想要完成以下操作,但现在无法编译:
if (newVal > numeric_limits<decltype(someAtomic)>::max()) throw "newVal too large";
else someAtomic.store(newVal, memory_order_release);
看起来至少在 VC++2015 中没有 numeric_limits 原子类型的特化,即使它们的基础类型确实有这样的特化。处理此问题的最佳方法是什么?
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();
}
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 中,需要专门处理 "user defined types",如果 std::atomic<int>
是用户定义的,我不确定这个问题是否已经解决。我看到了一个修复建议,但不确定它是否适用。
无论如何,这遵循了最小意外原则,并且同样有效。只有在替代方案不切实际时,才应在 std
命名空间中乱搞东西。
出了点问题,您的代码突然变得格式错误,不需要诊断。检查您的代码的人理所当然地感到害怕。修改你的代码的人不能搞砸。 my_numeric_limits
稳健、安全且不易出错。