2017-07-26 8 views
0

someAtomicは、atomic_uint16_tのような整数型の基本型を持つstd :: atomicであるとします。今コンパイルしない、私は特定のコードでは、しかし、WHICH整数型を想定したくないので、私は次のことを達成するために何かをしたい:原子タイプのnumeric_limits

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

それは、少なくともVCでのように見える++基本型にそのような特殊化があっても、atomic型のnumeric_limits特殊化はありません。これに対処する最良の方法は何ですか?

答えて

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は堅牢で安全であり、エラーに耐えます。

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

標準ライブラリのタイプの標準テンプレートを特殊化することが許可されているかどうかわかりません – KABoissonneault

+2

これが許可されていると私は非常に驚きます。あなたの主張をバックアップできますか? – hvd